-
[Spring] ๊น์ํ ์คํ๋ง ํต์ฌ์๋ฆฌ <์น์ 2.์คํ๋ง ํต์ฌ์๋ฆฌ ์ดํด1 - ์์ ๋ง๋ค๊ธฐ> ์ ๋ฆฌ
2023. 10. 6.
์น์ 2. ์คํ๋ง ํต์ฌ์๋ฆฌ ์ดํด1 - ์์ ๋ง๋ค๊ธฐ
ํ๋ก์ ํธ ์์ฑ
dependencies ์๋ฌด๊ฒ๋ ์ ํx
๋น์ฆ๋์ค ์๊ตฌ์ฌํญ๊ณผ ์ค๊ณ
- ํ์
- ํ์์ ๊ฐ์ ํ๊ณ ์กฐํํ ์ ์๋ค.
- ํ์์ ์ผ๋ฐ๊ณผ VIP ๋ ๊ฐ์ง ๋ฑ๊ธ์ด ์๋ค.
- ํ์ ๋ฐ์ดํฐ๋ ์์ฒด DB๋ฅผ ๊ตฌ์ถํ ์ ์๊ณ , ์ธ๋ถ ์์คํ ๊ณผ ์ฐ๋ํ ์ ์๋ค. (๋ฏธํ์ ) ⇒ ์ธํฐํ์ด์ค๋ก ์ญํ ๊ณผ ๊ตฌํ์ ๊ตฌ๋ถ
- ์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ
- ํ์์ ์ํ์ ์ฃผ๋ฌธํ ์ ์๋ค.
- ํ์ ๋ฑ๊ธ์ ๋ฐ๋ผ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ ์ ์๋ค.
- ํ ์ธ ์ ์ฑ ์ ๋ชจ๋ VIP๋ 1000์์ ํ ์ธํด์ฃผ๋ ๊ณ ์ ๊ธ์ก ํ ์ธ์ ์ ์ฉํด๋ฌ๋ผ. (๋์ค์ ๋ณ๊ฒฝ ๋ ์ ์๋ค.)
- ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ํ์ฌ์ ๊ธฐ๋ณธ ํ ์ธ ์ ์ฑ ์ ์์ง ์ ํ์ง ๋ชปํ๊ณ , ์คํ ์ง์ ๊น์ง ๊ณ ๋ฏผ์ ๋ฏธ๋ฃจ๊ณ ์ถ๋ค. ์ต์ ์ ๊ฒฝ์ฐ ํ ์ธ์ ์ ์ฉํ์ง ์์ ์ ๋ ์๋ค. (๋ฏธํ์ ) ⇒ ์ธํฐํ์ด์ค๋ก ์ญํ ๊ณผ ๊ตฌํ์ ๊ตฌ๋ถ
ํ์ ๋๋ฉ์ธ ์ค๊ณ
ํ์ ๋๋ฉ์ธ ํ๋ ฅ ๊ด๊ณ
- ํด๋ผ์ด์ธํธ๊ฐ ํ์ ์๋น์ค๋ฅผ ํธ์ถ → ํ์ ์๋น์ค๋ ๊ฐ์ ๊ณผ ์กฐํ๋ผ๋ 2๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณต
- ํ์ ์ ์ฅ์(์ธํฐํ์ด์ค)๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ ํ์ ๋ฐ์ดํฐ์ ๋ฐ๋ก ์ ๊ทผํ๋ ๊ณ์ธต์ ๋ง๋ ๋ค
- ํ์ ์ ์ฅ์(์ธํฐํ์ด์ค) ์ญํ ์ ๊ตฌํ์ 3๊ฐ์ง๋ก ๋๋์ด, ์ด ์ ์ค์ ํ๋๋ก ๊ตฌํ์ฒด๋ฅผ ์ ํํ๋ฉด ๋๋๋ก ๋ง๋ ๋ค
- ์์ฒด db, ์ธ๋ถ ์์คํ ์ฐ๋๋ ๋ฏธํ์ ์ด์ง๋ง ๊ฐ๋ฐ์ ์๋๊ณ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์.. ๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์๋ฅผ ์ผ๋จ ๋ง๋ค์ด์ ๊ฐ๋ฐ์ ์งํ
- ๋ฉ๋ชจ๋ฆฌ → ์๋ฒ๊ฐ ์ฌ๋ถํ ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ ์๊ฐ → ๋์ค์ db๋ ์ ์ฅ์๊ฐ ์ ํ๋๋ฉด ๊ทธ ๋ถ๋ถ์ ๊ตฌํํด์ ๊ต์ฒด. ์ญํ ๊ณผ ๊ตฌํ์ ๊ต์ฒดํ๋ค
ํ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
- ๋ฉค๋ฒ ์๋น์ค๋ฅผ ์ธํฐํ์ด์ค๋ก → ์ด์ ๋ํ ๊ตฌํ์ฒด MemberServiceImpl
- ๋ฉค๋ฒ ์๋น์ค ๋ ํ์งํ ๋ฆฌ(ํ์ ์ ์ฅ์ ์ธํฐํ์ด์ค) → ์ด์ ๋ํ ๊ตฌํ ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฉค๋ฒ ๋ ํ์งํ ๋ฆฌ์ db๋ฉค๋ฒ ๋ ํ์งํ ๋ฆฌ
⇒ ์ค์ ์๋ฒ๊ฐ ์คํ๋์ง ์๊ณ ํด๋์ค๋ค์ ๋ถ์ํด์ ๋ณด์ฌ์ฃผ๋ ์ ์ ์ธ ๋ถ๋ถ
๊ตฌํ์ฒด๋ค์ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ ๋ถ๋ถ. ์๋ฒ๊ฐ ๋ ์ผ ๊ฒฐ์ ๋๋ฏ๋ก ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ์ ๋ฐ๋ก ๊ทธ๋ ค์ ์๋ฒ๊ฐ ์ค์ ๋ด์ ๋์ ๋์์ ๊ทธ๋ ค๋ธ๋ค
ํ์ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ
- ์ค์ ๊ฐ์ฒด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๋ฅผ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ
- ํ์ ์๋น์ค๋ MemberServiceImpl
- ํด๋ผ์ด์ธํธ๋ ํ์ ์๋น์ค๋ฅผ ์ฐธ์กฐ, ํ์ ์๋น์ค๋ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์๋ฅผ ์ฐธ์กฐ
⇒ ์ค์ ์ ํ ์ธ์คํด์ค๋ผ๋ฆฌ์ ์ฐธ์กฐ. ๋์ ์ธ ๋ถ๋ถ.
ํญ์ ์ด 3๊ฐ์ง์ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๊ฐ๋ ์ ์ธ ๋ถ๋ถ์ ํํ
ํ์ ๋๋ฉ์ธ ๊ฐ๋ฐ
ํ์ ๋ฑ๊ธ
package hello.core.member; public enum Grade { //ํ์ ๋ฑ๊ธ 2๊ฐ์ง BASIC, VIP }
- enum : ๊ด๋ จ์๋ ์์๋ผ๋ฆฌ ๋ชจ์ ์์๋ฅผ ๋ํํ ์ ์๋ ์ด๋ฆ์ผ๋ก ํ์ ์ ์ ์, ๋ง์น ํด๋์ค์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ์์ ⇒ ๋ณ๋์ ์๋ฐ๋ก ์ ์ธ, class ๋ด๋ถ์์ ์ ์ธ, class ์ธ๋ถ์์ ์ ์ธ
- enum์ ํตํด BASIC๊ณผ VIP ๋ ๊ฐ์ง์ ํ์ ์ด ์๋ ํ์ ๋ฑ๊ธ์ ๊ด๋ฆฌ
ํ์ ์ํฐํฐ
package hello.core.member; public class Member { private Long id; private String name; private Grade grade; //id,์ด๋ฆ,grade 3๊ฐ์ง ์์ฑ์ ๋ณด์ public Member(Long id, String name, Grade grade) { this.id = id; this.name = name; this.grade = grade; } //getter-setter method๋ฅผ ํตํด์ private์ ๊ฐ์ ์ธํ 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; } }
- getter setter method : ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ธ๋ถ ๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ ๊ทผํ์ฌ ๋ณ๊ฒฝํ๋๋ก ์ ๋ → ์ด ์ญํ ์ ํ๋ ๊ฒ์ด Setter (๋ณ์๋ฅผ ํ ๋น)
- ์ธ๋ถ์์ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉ → ์ด๋ฌํ ์ญํ ์ ํ๋ ๊ฒ์ด Getter (๋ณ์๋ฅผ ๋ฐํ)
ํ์ ์ ์ฅ์
ํ์ ์ ์ฅ์ ์ธํฐํ์ด์ค
package hello.core.member; public interface MemberRepository { void save(Member member); //ํ์์ ์ ์ฅ Member findById(Long memberId); //ํ์์ ์์ด๋๋ก ํ์์ ์ฐพ๋ ๊ธฐ๋ฅ } //์ธํฐํ์ด์ค์ ๋ํ ๊ตฌํ์ฒด๊ฐ ํ์. ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ค๋ฅธ ํจํค์ง์ ๋๋ ๊ฒ์ด ์ข์ ์ค๊ณ, ์ด๋ฒ์๋ ๊ฐ์ ํจํค์ง๋ก
๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์ ๊ตฌํ์ฒด
package hello.core.member; import java.util.HashMap; import java.util.Map; //db๊ฐ ํ์ ๋์ง ์์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฉค๋ฒ ๋ฆฌํ์งํ ๋ฆฌ๋ฅผ ์ด์ฉ. MemberRepository์ ๊ตฌํ์ฒด public class MemoryMemberRepository implements MemberRepository{ @Override public void save(Member member) { store.put(member.getId(), member); } @Override public Member findById(Long memberId) { return store.get(memberId); } private static Map<Long, Member> store = new HashMap<>(); //์ ์ฅ์ ์ญํ //concurrent ๋์์ฑ ์ด์๊ฐ ์์ผ๋ฏ๋ก ์ค๋ฌด์์๋ ๋จ์ HashMap์ด ์๋ concurrent hashmap์ ์ฌ์ฉํด์ผ ํจ. }
ํ์ ์๋น์ค
ํ์ ์๋น์ค ์ธํฐํ์ด์ค
package hello.core.member; public interface MemberService { void join(Member member); Member findMember(Long memberId); }
ํ์ ์๋น์ค ๊ตฌํ์ฒด
package hello.core.member; //๋ฉค๋ฒ ์๋น์ค implement์ ๊ตฌํ์ฒด -> ํ์ ๊ฐ์ ๊ณผ ์กฐํ๋ฅผ ์ํด์ ์ด๋ค ๊ฒ์ด ํ์ํ ๊น? => ๋ฉค๋ฒ ๋ ํ์งํ ๋ฆฌ ์ธํฐํ์ด์ค๊ฐ ํ์ public class MemberServiceImpl implements MemberService { //์ค๋ฅธ์ชฝ ๋ถ๋ถ -> ์ค์ ํ ๋นํ๋ ๋ถ๋ถ์ด ๊ตฌํ์ฒด๋ฅผ ์์กด (์ถ์ํ, ๊ตฌ์ฒดํ ๋ ๋ค์ ์์กด) => DIP ์๋ฐ private final MemberRepository memberRepository = new MemoryMemberRepository(); //๋จ์ํ ์ธํฐํ์ด์ค๋ง ์ ์ผ๋ฉด null point exception ๋ฐ์ -> ๊ตฌํ ๊ฐ์ฒด ์ ํ(MemoryMemberRepository) @Override public void join(Member member) { memberRepository.save(member); //๋คํ์ฑ์ ์ํด memberRepository์ save๊ฐ ํธ์ถ๋จ } @Override public Member findMember(Long memberId) { return memberRepository.findById(memberId); } }
ํ์ ๋๋ฉ์ธ ์คํ๊ณผ ํ ์คํธ
ํ์ ๋๋ฉ์ธ - ํ์ ๊ฐ์ main
package hello.core; import hello.core.member.Grade; import hello.core.member.Member; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; public class MemberApp { public static void main(String[] args) { MemberService memberService = new MemberServiceImpl(); Member member = new Member(1L, "memberA", Grade.VIP); //Long type์ด๋ผ L ๋ถ์ฌ์ค์ผ ๋จ memberService.join(member); //id๊ฐ 1, ์ด๋ฆ์ด memberA์ธ ๋ฉค๋ฒ์ ํ์๊ฐ์ ์ค์ ๋์ Member findMember = memberService.findMember(1L); //๊ฐ์ ๋ฉค๋ฒ์ findMember๊ฐ ์ผ์นํ๋ฉด ์ ๋๋ก ๋์ํ ๊ฒ System.out.println("member = " + member.getName()); //์ด๋ฆ์ ์ถ๋ ฅํด์ ํ์ธ System.out.println("fineMember = " + findMember.getName()); } }
์ง๊ธ๊น์ง๋ Spring ๊ด๋ จ ์ฝ๋x ์์ํ ์๋ฐ๋ก๋ง ์ด๋ฃจ์ด์ง ์ฝ๋๋ค
์ด๋ ๊ฒ print๋ฅผ ํตํด ๋ฉ์ธ ๋ฉ์๋๋ฅผ ํ ์คํธ ํ๋ ๊ฒ์ ํ๊ณ๊ฐ ์์ ⇒ JUnit test framework ์ฌ์ฉ (์ค๋ฅ ๋ฐ์ํ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋นจ๋ฆฌ catchํ ์ ์์) ํ์๋ก ์ฌ์ฉํจ.
test์ ๋ํ ์ฝ๋๋ ์ด์ํ๊ฒฝ์ ๋ฐฐํฌ๋์ง ์์.
ํ์ ๋๋ฉ์ธ - ํ์ ๊ฐ์ ํ ์คํธ
package hello.core.member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; 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); } }
์ด๋ฌํ ๋ฐฉ์์ OCP,DIP๋ฅผ ์ ์งํค๊ณ ์๋๊ฐ? ์ธํฐํ์ด์ค๋ฟ๋ง ์๋๋ผ ๊ตฌํ์ฒด๊น์ง ๋ชจ๋ ์์กดํ๋ค๋ ๋ฌธ์ ์ ์ด ์์. MemberRepository
์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ์ค๊ณ
์ฃผ๋ฌธ ๋๋ฉ์ธ ์ญํ
1. ์ฃผ๋ฌธ ์์ฑ: ํด๋ผ์ด์ธํธ(๋ฉ์ธ ๊ฐ์ ์ฝ๋ ํน์ ์ปจํธ๋กค๋ฌ) ๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ ์ฃผ๋ฌธ ์๋น์ค์ ์ฃผ๋ฌธ ์์ฑ์ ์์ฒญํ๋ค.
2. ํ์ ์กฐํ: ํ ์ธ์ ์ํด์๋ ํ์ ๋ฑ๊ธ์ด ํ์ํ๋ค. ๊ทธ๋์ ์ฃผ๋ฌธ ์๋น์ค๋ ํ์ ์ ์ฅ์์์ ํ์์ ์กฐํํ๋ค.(findbyId)
3. ํ ์ธ ์ ์ฉ: ์ฃผ๋ฌธ ์๋น์ค๋ ํ์ ๋ฑ๊ธ์ ๋ฐ๋ฅธ ํ ์ธ ์ฌ๋ถ๋ฅผ ํ ์ธ ์ ์ฑ ์ ์์ํ๋ค.
4. ์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ฐํ: ์ฃผ๋ฌธ ์๋น์ค๋ ํ ์ธ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.(์ค์ ๋ก๋ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ db์ ์ ์ฅ)
์ฃผ๋ฌธ ๋๋ฉ์ธ ์ ์ฒด (์ญํ , ๊ตฌํ)
- ์ญํ → ๊ตฌํ์ ๋ถ๋ฆฌ. ์์ ๋กญ๊ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝ ๊ฐ๋ฅ. ํ์ ์ ์ฅ์ ๋ฟ๋ง ์๋๋ผ ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ํด๋ผ์ด์ธํธ์ ์ฃผ๋ฌธ ์๋น์ค์ ์ฃผ๋ฌธ ์์ฑ→ ํ์ ์กฐํํ๊ณ ํ ์ธ์ ์ฑ ์ ์กฐํํด์ ํด๋ผ์ด์ธํธ์ ๋ฐํ
์ฃผ๋ฌธ ๋๋ฉ์ธ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
- OrderService ์ธํฐํ์ด์ค → ์ด์ ๋ํ ๊ตฌํ์ฒด OrderServiceImpl
์ฃผ๋ฌธ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ
ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๋ฌธ ์๋น์ค ๊ตฌํ์ฒด๋ฅผ ํธ์ถ → ๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์์ ์ ์ก ํ ์ธ ์ ์ฑ ์ ํธ์ถ
์ญํ ๋ค์ ํ๋ ฅ ๊ด๊ณ๋ฅผ ์ฌ์ฌ์ฉ ํ ์ ์๋ค๋ ๋ง ⇒ ๋ฉ๋ชจ๋ฆฌ ํ์ ์ ์ฅ์๊ฐ ๋ณํํด๋, ํ ์ธ ์ ์ฑ ์ด ๋ณํํด๋ ์ฃผ๋ฌธ ์๋น์ค ๊ตฌํ์ฒด๋ฅผ ์์ ํ ํ์๊ฐ ์๋ค๋ ๋ง
์ด๋ฐ ์์ผ๋ก ์ ์ฅ์์ ํ ์ธ ์ ์ฑ ์ด ๋ณํํด๋ ์ฃผ๋ฌธ ์๋น์ค ์ญํ ์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค
์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ๊ฐ๋ฐ
ํ ์ธ ์ ์ฑ ์ธํฐํ์ด์ค
package hello.core.discount; import hello.core.member.Member; public interface DiscountPolicy { //@return ํ ์ธ๋์ ๊ธ์ก int discount(Member member, int price); }
์ ์ก ํ ์ธ ์ ์ฑ ๊ตฌํ์ฒด
package hello.core.discount; import hello.core.member.Grade; import hello.core.member.Member; public class FixDiscountPolicy implements DiscountPolicy{ private int discountFixAmount=1000;//1000์ ํ ์ธ @Override public int discount(Member member, int price) { if (member.getGrade() == Grade.VIP){ //VIP๋ฉด 1000์ ํ ์ธ return discountFixAmount; } else{ return 0; //VIP ์๋๋ฉด ํ ์ธ ์์ } } }
์ฃผ๋ฌธ ์ํฐํฐ
package hello.core.order; public class Order { private Long memberId; private String itemName; private int itemPrice; private int discountPrice; public Order(Long memberId, String itemName, int itemPrice, int discountPrice) { this.memberId = memberId; this.itemName = itemName; this.itemPrice = itemPrice; this.discountPrice = discountPrice; } //๋น์ฆ๋์ค ๋ก์ง => ํ ์ธ ๊ธ์ก์ ๋ฐ๋ผ ๊ณ์ฐ๋ ์ต์ข ๊ณ์ฐ ๊ธ์ก public int calculatePrice(){ return itemPrice-discountPrice; } public Long getMemberId() { return memberId; } public void setMemberId(Long memberId) { this.memberId = memberId; } public String getItemName() { return itemName; } public void setItemName(String itemName) { this.itemName = itemName; } public int getItemPrice() { return itemPrice; } public void setItemPrice(int itemPrice) { this.itemPrice = itemPrice; } public int getDiscountPrice() { return discountPrice; } public void setDiscountPrice(int discountPrice) { this.discountPrice = discountPrice; } //generate toString @Override public String toString() { return "Order{" + "memberId=" + memberId + ", itemName='" + itemName + '\\'' + ", itemPrice=" + itemPrice + ", discountPrice=" + discountPrice + '}'; } }
์ฃผ๋ฌธ ์๋น์ค ์ธํฐํ์ด์ค
package hello.core.order; public interface OrderService { //์ฃผ๋ฌธ ์์ฑ -> ์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ฐํ Order createOrder(Long memberId, String itemName, int itemPrice); }
์ฃผ๋ฌธ ์๋น์ค ๊ตฌํ์ฒด
package hello.core.order; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.member.Member; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; //๋จ์ผ ์ฑ ์ ์์น์ ์ ์งํจ ๋ฐฉ์ ํ ์ธ์ ๋ํ ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด ์ฃผ๋ฌธ์ชฝ ์ฝ๋๋ฅผ ๊ณ ์น ํ์๊ฐx public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member=memberRepository.findById(memberId); //ํ์์ ๋ณด ์กฐํ int discountPrice=discountPolicy.discount(member, itemPrice); //ํ ์ธ์ ์ฑ ์ ํ์ ์ ๋ณด๋ฅผ ๋๊น ๊ทธ๋ฆฌ๊ณ ์ต์ข ์ ์ผ๋ก ํ ์ธ๋ ๊ฐ๊ฒฉ์ ๋ฐํ return new Order(memberId, itemName, itemPrice, discountPrice); //์ต์ข ์์ฑ๋ ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ๋๊ธด๋ค } }
์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ์คํ& ํ ์คํธ
์คํ
package hello.core; import hello.core.member.Grade; import hello.core.member.Member; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.order.Order; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; public class OrderApp { public static void main(String[] args) { MemberService memberService = new MemberServiceImpl(); OrderService orderService = new OrderServiceImpl(); Long memberId=1L; Member member= new Member(memberId,"memberA", Grade.VIP ); memberService.join(member); //ํ์์ ์์ฑํด์ ๊ฐ์ ์ํด -> ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด์ ๋ฃ์ด๋์ Order order = orderService.createOrder(memberId, "itemA",10000); System.out.println("order = "+order); System.out.println("order.calculatePrice = "+ order.calculatePrice()); //์ด๋ฌํ ํ๋ฆฐํธ ๋ฐฉ์๋ณด๋ค๋ JUnit์ ์ด์ฉํ๊ธฐ } }
ํ ์คํธ
package hello.core.order; import hello.core.member.Grade; import hello.core.member.Member; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; public class OrderServiceTest { MemberService memberService = new MemberServiceImpl(); OrderService orderService = new OrderServiceImpl(); @Test void createOrder(){ Long memberId = 1L; //long์ผ๋ก ํ๋ฉด null์ด ๋ค์ด๊ฐ ์ ์์ Member member = new Member(memberId, "memberA", Grade.VIP); memberService.join(member); Order order= orderService.createOrder(memberId, "itemA", 10000); Assertions.assertThat(order.getDiscountPrice()).isEqualTo((1000)); } }
๋จ์ํ ์คํธ(์คํ๋ง์ด๋ ์ปจํ ์ด๋ ๋์ ์์ด ์๋ฐ ์ฝ๋๋ก ํ ์คํธ ํ๋ ๊ฒ)๋ฅผ ์ ๋ง๋๋ ๊ฒ์ด ์ค์ํ๋ค
๋จ์ถํค
commnad+n : genarate ๋จ์ถํค
command+a : ์ ์ฒด ์ ํ
option+enter : ๋ญ๊ฐ.. ์ ์ ๋ ๋… ๋นจ๊ฐ์ค ์์์ ์น๋ฉด ๋ฌธ์ ํด๊ฒฐํด์ค
command+shift+enter : ์ธ๋ฏธ์ฝ๋ก ์๋์์ฑ
psvm+enter : public static void main(String[] args) ๋จ์ถํค
command+option+v :
sout+enter: System.*out*.println(); ๋จ์ถํค
soutv+enter: ๋ณ์๋ฅผ ์์์ ์ ํ ๊ฐ๋ฅ
F2: ์ค๋ฅ๋ ๊ณณ์ผ๋ก ๋ฐ๋ก ์ด๋
'๐ญ Study > : Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
- ํ์