<์ค๋์ ๋ณต์ต>
- spring
๐ง ์์ ๋ง๋ค๊ธฐ
ํ๋ก์ ํธ ์์ฑ
- ์ด๋ฒ ํ๋ก์ ํธ์์๋ ์์ํ '์๋ฐ'๋ก๋ง ํ ๊ฒ์ด๋ค (ํ๋ก์ ํธ ํ๊ฒฝ์ ํธ๋ฆฌํ๊ฒ ํ๋ ค๊ณ ๋ถํธ๋ฅผ ์ฌ์ฉํจ, ๋น์ฅ์ ์์ํ ์๋ฐ๋ก๋ง ๊ฐ๋ฐ์ ์งํํ ๊ฒ์ด๋ฉฐ ๋์ค์ ์คํ๋ง ์ถ๊ฐํ ๊ฒ์ - ์ ํ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ง ์์)
โญ ํ๋ก์ ํธ ์ ํ
๐น Project: Gradle - Groovy Project
Spring Boot: 2.3.x
Language: Java
Packaging: Jar
Java: 11
๐น Project Metadata groupId: hello
artifactId: core
Dependencies: ์ ํํ์ง ์์

- gradle์ ํตํด ์คํดํ๋ ๊ฒ๋ณด๋ค ์ธํ ๋ฆฌ์ ์ด๋ก ์คํํด์ผ ๋น ๋ฆ! (์ธํ ๋ฆฌ์ ์ด์์ ์๋ฐ๋ฅผ ๋ฐ๋ก ์คํ) - ๊ฐ์ฌ๋ ์ถ์ฒ!
- ์ต๊ทผ IntelliJ ๋ฒ์ ์ Gradle์ ํตํด์ ์คํ ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ ์ค์ , ์ด๋ ๊ฒ ํ๋ฉด ์คํ์๋๊ฐ ๋๋ฆผ ์์๊ฐ์ด ๋ณ๊ฒฝํ๋ฉด ์๋ฐ๋ก ๋ฐ๋ก ์คํํด์ ์คํ์๋๊ฐ ๋ ๋น ๋ฆ
๋น์ฆ๋์ค ์๊ตฌ์ฌํญ๊ณผ ์ค๊ณ
๐น ํ์
- ํ์์ ๊ฐ์ , ์กฐํํ ์ ์์
- ํ์์ ์ผ๋ฐ ํ์/ VIP ํ์ ๋ ๊ฐ์ง ๋ฑ๊ธ์ด ์์
- ํ์ ๋ฐ์ดํฐ๋ ์์ฒด DB๋ฅผ ๊ตฌ์ถํ ์ ์์, ์ธ๋ถ ์์คํ ๊ณผ ์ฐ๋ํ ์ ์์(๋ฏธํ์ )
๐ธ์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ
- ํ์์ ์ํ์ ์ฃผ๋ฌธํ ์ ์์
- ํ์ ๋ฑ๊ธ์ ๋ฐ๋ผ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ ์ ์์
- ํ ์ธ ์ ์ฑ : ๋ชจ๋ VIP๋ 1000์์ ํ ์ธํด์ฃผ๋ ๊ณ ์ ๊ธ์ก ํ ์ธ์ ์ ์ฉ(๋์ค์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ์์)
- ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋์, ํ์ฌ์ ๊ธฐ๋ณธ ํ ์ธ ์ ์ฑ ์ ์์ง ์ ํ์ง ๋ชปํจ, ์คํ ์ง์ ๊น์ง ๊ณ ๋ฏผ์ ๋ฏธ๋ฃจ๊ณ ์ถ๊ณ , ์ต์ ์ ๊ฒฝ์ฐ ์ ์ฉํ์ง ์์ ์ ์์(๋ฏธํ์ )
- DB์ ํ ์ธ ๋ถ๋ถ์ ๊ด๋ จํด์๋ ์ธํฐํ์ด์ค๋ก ์ญํ , ๊ตฌํ ๋ถ๋ถ์ ๋๋๋ฉด ๋๋ค
- ํ ์ธ ์ ์ฑ - ๋ณ๊ฒฝ๋ ์ ์์ (ํ์ฌ๊ฐ ์์ง ์คํ ์ ์ด๋ผ ์ ์คํ๊ฒ ํ ์ธ ์ ์ฑ ์ ๊ณ ๋ฏผ์ค์ด๋ค)
- ๋น์ฅ ๊ฒฐ์ ํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ์ ์์ผ๋ ์ ์ฑ ์ด ๊ฒฐ์ ๋ ๋๊น์ง ๊ฐ๋ฐ์ ๋ฏธ๋ฃฐ์ ์์ผ๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ ๋ฐฉ๋ฒ์ ์ฌ์ฉ
- ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ → ์ธ์ ๋ ๊ฐ์ ๋ผ์ฐ๋ฉด ๋๋ค!!
ํ์ ๋๋ฉ์ธ ์ค๊ณ
- ํ์์ ๊ฐ์
, ์กฐํํ ์ ์์
- ํ์์ ์ผ๋ฐ ํ์/ VIP ํ์ ๋ ๊ฐ์ง ๋ฑ๊ธ์ด ์์
- ํ์ ๋ฐ์ดํฐ๋ ์์ฒด DB๋ฅผ ๊ตฌ์ถํ ์ ์์, ์ธ๋ถ ์์คํ
๊ณผ ์ฐ๋ํ ์ ์์(๋ฏธํ์ )

- ํ์ ์ ์ฅ์๋ ์์ง ๊ฒฐ์ X
- ํด๋ผ์ด์ธํธ๊ฐ ํ์ ์๋น์ค๋ฅผ ํธ์ถ
- ํ์์ ์ฅ์(์ธํฐํ์ด์ค)๋ฅผ ๋ณ๋๋ก ๋ง๋ฆ - ํ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ณ์ธต์ ๋ฐ๋ก ๋ง๋ฆ
- ํด๋ผ์ด์ธํธ, ํ์์๋น์ค, ํ์์ ์ฅ์ โก๏ธ "์ญํ "
- ๋ฉ๋ชจ๋ฆฌ, DB, ์ธ๋ถ ์์คํ ์ฐ๋ ํ์ ์ ์ฅ์ โก๏ธ "๊ตฌํ์ฒด"
- ๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์ : ๊ฐ๋จํ๊ฒ ์๋ฐ์ฝ๋๋ก๋ง ๋ฉ๋ชจ๋ฆฌ๋ก ํ์๊ฐ์ฒด๋ฅผ ๋ฃ๊ณ ๋นผ๊ณ ๋ฅผ ํ ์ ์๊ฒ ๋ง๋ค์ด ์ผ๋จ์ ๊ฐ๋ฐ์ ์งํ, ํ ์คํธ - ๋ก์ปฌ์์ ๊ฐ๋ฐ์์๋ง ์ฌ์ฉํ ๊ฒ์ด๋ค (โ ์๋ฒ๊ฐ ์ฌ๋ถํ ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ ๋ผ๊ฐ) - ๋์ค์ DB๋ ์ธ๋ถ ์์คํ ์ ๋ฃ์ ์ ์๋๋ก ๊ต์ฒด๋ง ํด์ฃผ๋ฉด ๋๋ค
- ๊ธฐํ์๋ค๋ ๋ณผ ์ ์์

- Impl : ๊ตฌํ์ฒด
- MemberRepository = ํ์์ ์ฅ์ ์ญํ
- ๊ฐ๋ฐ์๊ฐ ๊ตฌ์ฒดํ ํจ
- ์ค์ ์๋ฒ๋ฅผ ์คํํ์ง ์๊ณ ํด๋์ค๋ค๋ง ๋ถ์ํด์ ๋ณผ ์ ์์
- ์ ์ ์ธ ๊ฒ

- ๊ฐ์ฒด๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๋ ์ด๋ป๊ฒ ๋๋์ง
- ํ์ ์๋น์ค : MemberServiceImpl
- ๋์ ์ธ ๊ฒ
ํ์ ๋๋ฉ์ธ ๊ฐ๋ฐ
- ํ์ ๋ฑ๊ธ(enum์ผ๋ก ๋ง๋ฆ)
package hello.core.member;
public enum Grade {
BASIC,
VIP
}
- Member (ํ์ ์ํฐํฐ)
public class Member {
private Long id;
private String name;
private Grade grade;
public Member(Long id, String name, Grade grade) {
this.id = id;
this.name = name;
this.grade = grade;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
- MemberRepository (ํ์ ์ ์ฅ์)
public interface MemberRepository {
void save(Member member); // ํ์์ ์ ์ฅ
Member findById(Long memberId); // ํ์์ ์กฐํ
}
- save : ์ ์ฅ
- findById : ํ์์ id๋ก ํ์์ ์กฐ
- MemoryMemberRepository (๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์ ๊ตฌํ์ฒด)
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
@Override
public void save(Member member) {
store.put(member.getId(), member);
}
@Override
public Member findById(Long memberId) {
return store.get(memberId);
}
}
- โญ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ํ ๊ณณ์ ๋ฃ๋ ๊ฒ์ ์ข์ง x ์ด ์์ ์์๋ ๋ณต์กํ ๊ฒ์ ์ค์ด๋ ค๊ณ ๊ฐ์ด ๋ฃ์
- ์ ์ฅ์ → Map์ด ํ์!
- ์ค๋ฅ์ฒ๋ฆฌ๋ ๊ฐํธํ๊ฒ ํ๋ ์์ ์ด๋ฏ๋ก ์๋ต
- ์ค๋ฌด์์ HashMap ์ ๋์์ฑ ์ด์๊ฐ ๋ฐ์ํ ์ ์์(์ฌ๋ฌ ๊ตฐ๋ฐ์์ ์ ๊ทผ์ ํ๋ ค๊ณ ํ๋ฉด) โก๏ธ ConcurrentHashMap์ ์ฌ์ฉํด์ผ ํ๋ค
- DB๊ฐ ์์ง ํ์ x → ๊ฐ์ฅ ๋จ์ํ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์๋ฅผ ๊ตฌํํด ์ฐ์ ๊ฐ๋ฐ ์งํ
- MemberService
public interface MemberService { // ํ์ ๊ฐ์
, ์กฐํ
void join(Member member); // ๊ฐ์
Member findMember(Long memberId); // ์กฐํ
}
- ํ์ ๊ฐ์ , ์กฐํ ๋๊ฐ์ง!
- MemberServiceImpl
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
- ๊ด๋ก : ๊ตฌํ์ฒด๊ฐ ํ๋๋ง ์์ ๊ฒฝ์ฐ → ์ธํฐํ์ด์ค๋ช ๋ค์ Impl์ด๋ผ๊ณ ๋ง์ด ์ด๋ค
- ์ธํฐํ์ด์ค๋ง ๊ฐ์ง๊ณ ์ ์ผ๋ฉด nullPointException๋ฐ์
- join() ์์ save()๋ฅผ ํธ์ถํ๋ฉด? → ๋คํ์ฑ์ ์ํด MemoryMemberRepository์ ์๋ save()๊ฐ ํธ์ถ
ํ์ ๋๋ฉ์ธ ์คํ๊ณผ ํ ์คํธ
- MemberApp
public class MemberApp {
public static void main(String[] args) {
MemberService memberService = new MemberServiceImpl();
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new Member = " + member.getName());
System.out.println("find Member = " + findMember.getName());
}
}
- ์์ํ ์๋ฐ์ฝ๋ - ์คํ๋ง ๊ด๋ จ x
- ๊ทธ๋ฌ๋ ์ด๋ ๊ฒ ํ ์คํธํ๋ ๊ฒ์ ํ๊ณ๊ฐ ์์ - ์ข์ ๋ฐฉ๋ฒ x
- main ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก๋ - ๋์ผ๋ก ๊ฒ์ฆํ ์ ์์
- MemberServiceTest
public class MemberServiceTest {
MemberService memberService = new MemberServiceImpl();
@Test
void join() {
//given
Member member = new Member(1L, "memberA", Grade.VIP);
//when
memberService.join(member);
Member findMember = memberService.findMember(1L);
//then(๊ฒ์ฆ)
Assertions.assertThat(member).isEqualTo(findMember);
}
}
- ๋ฐฐํฌ์์๋ main์ ๋ํ ์ฝ๋๋ง ๋๊ฐ๊ณ test ์ฝ๋๋ x - ๋น๋๋ ๋ ๋น ์ง๋ค
- ํ ์คํธ๊ฐ ํต๊ณผํ๋ ๊ฑธ ํ์ธํ ์ ์์
- ํ ์คํธ ์คํจ → ์ด๋ป๊ฒํด์ ์ค๋ฅ๊ฐ ๋ฌ๋์ง ํ์ธ ๊ฐ๋ฅ, ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ ์คํจ๊ฐ ๋๋ ๊ฒ๋ ๋น ๋ฅด๊ฒ ์ก์ ์ ์์
- โํ ์คํธ ์์ฑ ๋ฐฉ๋ฒ์ ํ์๋ก ์์์ผ ํ๋ค!!
๐ ํ์ ๋๋ฉ์ธ ์ค๊ณ์ ๋ฌธ์ ์ !?
์์กด ๊ด๊ณ๊ฐ ์ธํฐํ์ด์ค ๋ฟ๋ง ์๋๋ผ ๊ตฌํ๊น์ง ๋ชจ๋ ์์กดํ๋ ๋ฌธ์ ์ ์ด ์๋ค
โก๏ธ ์ฃผ๋ฌธ๊น์ง ๋ง๋ค๊ณ ๋์ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ์์ ์ค๋ช ํ ๊ฒ์
- ์ค์ ํ ๋ฌํ๋ ๋ถ๋ถ์ด ๊ตฌํ์ฒด๋ฅผ ์์กดํจ
MemberServiceImpl → MemberRepository, MemoryMemberRepository ๋๊ฐ๋ค ์์กดํจ
→ ์ถ์ํ + ๊ตฌ์ฒดํ์ ์์กด (๋ณ๊ฒฝ์ด ์์ ๋ ๋ฌธ์ ๊ฐ ๋๋ค)
→ โ DIP๋ฅผ ์๋ฐ
<์ถ์ฒ - ์ธํ๋ฐ(์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ) , ๊น์ํ >
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ
www.inflearn.com
- (์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ) ๊ฐ์๋ฅผ ๋ฃ๊ณ ํ์ต์ ์ํด ์์ฑํ์ต๋๋ค.