<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

 

 

์„น์…˜ 3. ์˜ˆ์ œ๋งŒ๋“ค๊ธฐ์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ๊ตฌํ˜„์ฒด์˜ ์˜์กด์„ฑ์„ ์™„์ „ํžˆ ๋ฐฐ์ œํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํ•˜๋‚˜ํ•˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„๊ฐ€ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์˜€๋‹ค. ์ด๋ฒˆ ๊ฐ•์˜์—์„œ๋Š” ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์„ ๋ฐ”๊พธ๋ฉฐ ์Šคํ”„๋ง์˜ ์–ด๋–ค ์ ์ด ํŽธ๋ฆฌํ•˜์—ฌ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์„ ํƒํ–ˆ์ง€๋Š” ์•Œ์•„๊ฐ€๋Š” ๊ฐ•์˜๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์–ด๋–ค ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ์˜์กด์ ์ด์ง€ ์•Š๋Š” ์ฝ”๋“œ์ธ์ง€ ์•Œ์•„๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๋“ฏ ํ•˜๋‹ค.

 

 

 


 

[ โ—€๏ธŽ ]

 

[Spring] ๊น€์˜ํ•œ ๊ธฐ๋ณธํŽธ_ ์„น์…˜ 3. ์˜ˆ์ œ๋งŒ๋“ค๊ธฐ

์•„์ฃผ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์˜ ๊ธฐ์ดˆ ํ‹€์„ ๋งŒ๋“œ๋Š” ๊ฐ•์˜์˜€๋‹ค. ์—ฌ๊ธฐ์—์„œ ์•Œ์•„๋‘˜ ๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด๋‹ค. ํ˜„์žฌ ๊ฐ•์˜ ์‹œ์ ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜์ง„

post-this.tistory.com

 

 

 

 

 

๐Ÿงธ 

์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”


 

 

๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๋ ˆ์ธ ๊ผฌ์šฐ- ๐Ÿงธ

  • member
    ใ„ด class : Member, MemberServiceImpl, MemoryMemberRepository
    ใ„ด interface : MemberService, MemberRepository
    ใ„ด enum : Grade
  • discount
    ใ„ด class : FixDiscountPolicy, RateDiscountPolicy
    ใ„ด interface : DiscountPolicy
  • order
    ใ„ด class : Order, OrderServiceimpl
    ใ„ด interface : OrderService
  • test
    main
    ใ„ด MemberApp, OrderApp
    test
    ใ„ด RateDiscountPolicyTest, MemberServiceTest
  • AppConfig

 


 

โœ”๏ธ  discount

    < ์กฐ๊ฑด >

  • ์„œ๋น„์Šค ์˜คํ”ˆ ์ง์ „์— ํ• ์ธ ์ •์ฑ…์„ ์ง€๊ธˆ์ฒ˜๋Ÿผ ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ์ด ์•„๋‹ˆ๋ผ ์ข€ ๋” ํ•ฉ๋ฆฌ์ ์ธ ์ฃผ๋ฌธ ๊ธˆ์•ก๋‹น ํ•  ์ธํ•˜๋Š” ์ •๋ฅ % ํ• ์ธ์œผ๋กœ ๋ณ€๊ฒฝ.
  • ๊ธฐ์กด ์ •์ฑ…์€ VIP๊ฐ€ 10000์›์„ ์ฃผ๋ฌธํ•˜๋“  20000์›์„ ์ฃผ๋ฌธํ•˜๋“  ํ•ญ์ƒ 1000์›์„ ํ• ์ธ.
  • ์ƒˆ๋กœ ๋‚˜์˜จ ์ •์ฑ…์€ 10%๋กœ ์ง€์ •ํ•ด๋‘๋ฉด ๊ณ ๊ฐ์ด 10000์› ์ฃผ๋ฌธ์‹œ 1000 ์›์„ ํ• ์ธํ•ด์ฃผ๊ณ , 20000์› ์ฃผ๋ฌธ์‹œ์— 2000์›์„ ํ• ์ธํ•ด์ฃผ๋Š” ๊ฑฐ์—์š”!

 

โ–บ RateDiscountPolicy

: ์ด ์ฃผ๋ฌธ ๊ธˆ์•ก์˜ 10% ํ• ์ธ ์ •์ฑ…

 

private int discountPercent =10;
.
.
    if (member.getGrade() == Grade.VIP) {
            return price * discountPercent / 100;
        }

 

์ •๋ฅ ํ• ์ธ์ •์ฑ…์ธ RateDiscountPolicy๋Š” DiscountPolicy ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์ธ DiscountPolicy์— ์†ํ•ด์žˆ๋Š” discount ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จ์‹œ์ผœ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค. ๋ฉ”์„œ๋“œ discount๋ฅผ ์ œ๋Œ€๋กœ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  member์™€ price ๊ฐ’์ด ๋“ค์–ด์™€์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋“ค์–ด์˜จ member์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ Member๋ฅผ ํ†ตํ•ด getGradeํ•˜์—ฌ VIP์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๊ทธ ํ›„ ๋“ค์–ด์˜จ price๊ฐ’์„ ํ• ์ธ๋ฅ ์„ ๊ณ„์‚ฐํ•˜์—ฌ returnํ•œ๋‹ค.

 

 

 


 

 

โœ”๏ธ  Test

 

โ–บ RateDiscountTest

: % ํ• ์ธ ๊ด€๋ จ ํ…Œ์ŠคํŠธ 

 

 

ํ…Œ์ŠคํŠธ ๋งŒ๋“œ๋Š” ๋‹จ์ถ•๊ธฐ

mac : cmd + shift + T 

    @Test
    @DisplayName("VIP๋Š” 10% ํ• ์ธ์ด ์ ์šฉ๋˜์–ด์•ผํ•œ๋‹ค.")
    void vip_o() {

        Member member = new Member(1L, "memberVIP", Grade.VIP);

        int discount = discountPolicy.discount(member, 10000);
        
        assertThat(discount).isEqualTo(1000);

    }

 

 

@Test

: ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ์œ„์— ์„ ์–ธํ•ด์•ผ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์ด ๋œ๋‹ค.

 

 

assertThat(A).isEqualTo(B)

: A์™€ B์˜ ๊ฐ’์ด ๋งž๋Š”์ง€ ๋Œ€์ƒ ๋‚ด์šฉ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๋Š” ํ…Œ์ŠคํŠธ๋‹ค.

 

 

@Test ํ•  ๋•Œ ์“ฐ๋Š” ๊ณต์‹

โžฐ  given (์‹คํ–‰๋‹จ๊ณ„) : ์–ด๋–ค ์กฐ๊ฑด์„ ์ฃผ๊ณ 
Member member = new Member(1L, "memberVIP", Grade.VIP);
โ–ป ID๋Š” 1L, ์ด๋ฆ„์€ memberVIP, ๋“ฑ๊ธ‰์€ VIP์ธ member๊ฐ€

โžฐ   when (์‹คํ–‰๋‹จ๊ณ„) : ์ƒํ™ฉ์ด ์–ด๋– ํ• ๋•Œ
int discount = discountPolicy.discount(member, 10000);
โ–ป ์ด ๊ธˆ์•ก ๋งŒ์›์„ ํ• ์ธ ์ •์ฑ…์— ๋„ฃ์—ˆ์„ ๋•Œ

โžฐ  then (๊ฒ€์ฆ๋‹จ๊ณ„) : ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผ ํ•œ๋‹ค.
assertThat(discount).isEqualTo(1000);
โ–ป ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ 1000์ด ๋˜์–ด์•ผํ•œ๋‹ค.

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

import static org.assertj.core.api.Assertions.*;

 

Assertions

: AssertJ์—์„œ ์ œ๊ณตํ•˜๋Š” API๋กœ ํ…Œ์ŠคํŠธ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.

 

 

Assertions.assertThat(discount).isEqualTo(1000);

 

๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ฝ”๋“œ

mac: command + enter

assertThat(discount).isEqualTo(1000);

 

 

assertThat(A).isEqualTo(B)

: A์˜ ๊ฐ’์ด ๊ธฐ๋Œ“๊ฐ’ B์™€ ๊ฐ™์€์ง€ ํ™•์ธํ•ด์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค.
ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” discount์˜ ๊ฐ’๊ณผ 1000์˜ ๊ฐ’์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ฐ˜๋Œ€๋กœ ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋Š” assertThat(A).isNotEqualTo(B)์ด ๋˜๊ฒ ๋‹ค.

 

 

 

- ๋‹ค์–‘ํ•œ assertThat()์˜ ์ •๋ณด๋ฅผ ์ œ๊ณต, ์ถœ์ฒ˜

 

[Spring] Junit5 Assertions, assertThat()

์ด ๊ธ€์€ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ๋“ค์„ ๊ธฐ๋กํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋‚˜ ๊ณ ์ณ์•ผ ํ•  ์‚ฌํ•ญ๋“ค์ด ์žˆ๋‹ค๋ฉด ์ง€์  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! โ›…๏ธ Assertions ์ด์ „ ํฌ์ŠคํŠธ์—์„œ Junit5๋ฅผ ํ†ตํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

m42-orion.tistory.com

 

 

 

 


 

 

 

โœ”๏ธ  AppConfig

 

OCP์™€ DIP๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐํ•  ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

์ฆ‰, ํ™˜๊ฒฝ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•  ํด๋ž˜์Šค์ด๋‹ค. ๋ณดํ†ต Ioc์ปจํ…Œ์ด๋„ˆ ํ˜น์€ DI์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

 

 

Q. ์›๋ž˜ ๋ฌธ์ œ์ ์€?


A.  OrderServiceImpl์ด FixDiscountPolicy์— ์˜์กดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

์ˆ˜์ • ์ „ ์ฝ”๋“œ

public class OrderServiceImpl implements OrderService {
     private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
 }

 

 

ํ• ์ธ ์ •์ฑ…์ด ๋‹ฌ๋ผ์ง€๋ฉด OrderServiceImpl ํด๋ž˜์Šค์— ๊ฐ€์„œ RateDiscounPolicy๋ฅผ ๋‹ค๋ฅธ ํ• ์ธ ์ •์ฑ… ํด๋ž˜์Šค๋กœ ๋งค๋ฒˆ ์ˆ˜์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

 

์ˆ˜์ • ํ›„ ์ฝ”๋“œ

public class OrderServiceImpl implements OrderService{

   private final MemberRepository memberRepository;
   private final DiscountPolicy discountPolicy;

   public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
       this.memberRepository = memberRepository;
       this.discountPolicy = discountPolicy;
   }
}

 

private

: ์„ ์–ธ๋œ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์•ˆํ•˜๋Š” ์ ‘๊ทผ์ œ์–ด์ž

 

final

: final์ด ๋ถ™์€ ๋ณ€์ˆ˜๋Š” ์ƒ์ˆ˜๊ฐ€ ๋˜์–ด, final์ด ๋ถ™์€ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.

 

 

Q. ์™œ ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ private final๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์„ ์–ธํ•˜๋‚˜?

A. private๋Š” ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋งŒ์•ฝ private๋งŒ ์ผ๋‹ค๋ฉด ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ณ€์ˆ˜ ๋‚ด์šฉ์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์˜€์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ final์ด ๋ถ™์œผ๋ฉด์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๋‹จ ํ•œ ๋ฒˆ์˜ ์ดˆ๊ธฐํ™”๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค. (ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜๋ฉด ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.) ๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ ์ ‘๊ทผ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒƒ๋„ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋†“์น˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋งˆ final์„ ํ†ตํ•ด ํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ผ ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ํ• ์ธ์ •์ฑ…์ด VIP๋งŒ 10ํผ์„ผํŠธ ํ• ์ธ์œผ๋กœ ์ง€์ •ํ•ด๋†จ๋Š”๋ฐ, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ ๋ชจ๋“  ๊ณ ๊ฐ์—๊ฒŒ 10ํผ์„ผํŠธ ํ• ์ธ์œผ๋กœ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ํฐ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜๊ธฐ์— ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž(์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•ด) ์ƒ์„ฑ์ž์— private final๋กœ ์„ ์–ธํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 

••• ์ด์–ด์„œ AppConfig ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

 

 

๋ฆฌํŒฉํ„ฐ๋ง ํ›„ ์ฝ”๋“œ

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }
.
.
.

    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }

}

 

@Configuration

: ์„ค์ •ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์• ๋…ธํ…Œ์ด์…˜ or Bean์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์• ๋…ธํ…Œ์ด์…˜์œผ๋กœ Bean์„ ๋“ฑ๋กํ•  ๋•Œ ์‹ฑ๊ธ€ํ†ค์ด ๋˜๋„๋ก ๋ณด์žฅํ•ด์ค€๋‹ค. ๋˜ ์Šคํ”„๋ง์ปจํ…Œ์ด๋„ˆ์—์„œ Bean์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

 

 

@Bean

: Spring์˜ DI Container์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” POJO(Plain Old Java Object)๋ฅผ Bean์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. @Bean์œผ๋กœ ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋“ค์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •ํ•œ๋‹ค.

 

 

AppConfig์— ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž๋Š” ๊ตฌํ˜„์ฒด๋ฅผ returnํ•ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด ์–ด๋–ค ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ •์˜ํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

MemberServiceImpl(๊ตฌํ˜„์ฒด)์€ MemberService(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ผญ ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ตฌํ˜„์ฒด ์† return ๊ฐ’์„ ๋ณด๋ฉด save์™€ findById๋กœ ์ฃผ๊ณ ์žˆ๋Š”๋ฐ, ํšŒ์›๊ฐ€์ž…์ด ๋œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ˜น์€ ์ €์žฅ์†Œ์— ๋“ค์–ด๊ฐ€์žˆ๋Š” ํšŒ์› ์ •๋ณด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด MemberRepository ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•ด๋ณด๋ฉด MemberService(์ธํ„ฐํŽ˜์ด์Šค) - MemberServiceImpl(๊ตฌํ˜„์ฒด)   ->   MemberRepository(์ธํ„ฐํŽ˜์ด์Šค) - MemoryMemberRepository(๊ตฌํ˜„์ฒด)๋กœ MemberServiceImpl์ด save์™€ findById๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด MemberRepository ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐํ–ˆ๊ณ  ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” MemberServiceImpl์„ ์ƒ์†ํ•˜๊ณ  ์žˆ๊ธฐ์— ๊ตฌํ˜„์ฒด์™€ ๊ตฌํ˜„์ฒด๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ƒํ™ฉ์„ ๋ง‰์€ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ AppConfig๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด ๋ฉ”์„œ๋“œ memberService( )๋Š” MemberService ํƒ€์ž…์œผ๋กœ ๋นˆ์„ ๋“ฑ๋กํ–ˆ๊ณ  MemberServiceImpl๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ๊ทธ ์†์—์„œ save์™€ findById๋ฅผ ์ˆ˜ํ–‰์„ ์œ„ํ•ด MemberRepository๋ฅผ ์˜์กด์„ฑ์œผ๋กœ ๋ฐ›์•„ ํšŒ์› ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

๊ทธ ์•„๋ž˜ DiscountPolicy๋ฅผ ๋ณด์ž. ์ „์˜ ๋ฌธ์ œ์ ์œผ๋กœ, OrderServiceImpl ํด๋ž˜์Šค์— ๋“ค์–ด๊ฐ€์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฐ”๋€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฒŒ ํ–ˆ๋‹ค.(FixDiscountPolicy๋ฅผ RateDiscountPolicy๋กœ) ๊ทธ๋Ÿฐ๋ฐ AppConfig์—์„œ ์ •์˜ํ•˜๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋‹ˆ OrderServiceImpl์—๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ •์˜ํ•˜๊ณ  AppConfig์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด๋ฅผ ์—ฐ๊ฒฐ์ง€์–ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

 

- @Configuration ์ •๋ณด ์ถœ์ฒ˜

 

[Spring] @Configuration ๊ฐœ๋…๊ณผ ์žฅ์ 

๋”๋ณด๊ธฐ 1. @Configuration ์ด๋ž€? : @Configuration์ด๋ผ๊ณ  ํ•˜๋ฉด ์„ค์ •ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์• ๋…ธํ…Œ์ด์…˜ or Bean์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์• ๋…ธํ…Œ์ด์…˜์ด๋‹ค. ๋”๋ณด๊ธฐ 2. @Configuration์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ญ๊ฐ€ ์ข‹์€๋ฐ? : @Configuration ์• 

castleone.tistory.com

 

 

 

- @Bean์— ๊ด€๋ จํ•œ ์–ด๋…ธํ…Œ์ด์…˜ ์ถœ์ฒ˜

 

[Spring] ๋นˆ ๋“ฑ๋ก์„ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜ @Bean, @Configuration, @Component ์ฐจ์ด ๋ฐ ๋น„๊ต - (1/2)

๊ธฐ์กด์˜ Spring MVC์—์„œ๋Š” xml์„ ํ™œ์šฉํ•˜์—ฌ Bean์„ ๋“ฑ๋กํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” ์š”์†Œ๋“ค์„ xml์— ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ๋ฒˆ๊ฑฐ๋กœ์›Œ ์ ธ์„œ ์–ด๋…ธํ…Œ์ด์…˜(Annotation, @)๋ฅผ ํ™œ

mangkyu.tistory.com

 

 

 

 

โœ”๏ธ  MemberServiceTest

์„น์…˜ 3์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •ํ•˜๊ธฐ.

 

     @BeforeEach
     public void beforeEach() {
         AppConfig appConfig = new AppConfig();
         memberService = appConfig.memberService();
     }

 

@BeforeEach

: ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate ๊ฐ€ ๋ถ™์€ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „์— ์‹คํ–‰๋œ๋‹ค.

 

ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์‚ฌ์šฉํ•  MemberService๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ…Œ์ŠคํŠธ์— ๋“ค์–ด๊ฐ„๋‹ค. AppConfig์— ์ •์˜๋˜์–ด์žˆ๋Š” memberService ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด AppConfig๋ฅผ ์ •์˜ํ•ด์คฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  memberService(์ธํ„ฐํŽ˜์ด์Šค)์™€ ์—ฐ๊ฒฐ๋œ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์˜ค๊ธฐ ์œ„ํ•ด์„œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค€๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ›„์— ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์—ฐ๊ฒฐ๋œ ๊ตฌํ˜„์ฒด์— ๋งž์ถฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

- @BeforeEach ์ถœ์ฒ˜

 

[Spring] @Before @BeforeClass @BeforeEach @BeforeAll

@Before @BeforeClass @BeforeEach @BeforeAll Spring ์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ „์— ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ธ์ฆ์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜

bcp0109.tistory.com

 

 

 

 


 

 

 

โœ”๏ธ  OrderApp

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ธฐ

 

 

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);

 

AnnotationConfigApplicationContext

: java ๊ธฐ๋ฐ˜์˜ ์„ค์ •ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Bean ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

AnnotationConfigApplicationContext์— ํ•ด๋‹น ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ Bean์ด ๋“ค์–ด์žˆ๋Š” ์„ค์ •ํด๋ž˜์Šค๋ฅผ ๊ด„ํ˜ธ ์•ˆ์— ๋„ฃ์–ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Bean์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.(@Bean์ด ๋ถ™์–ด์žˆ๋Š” ๊ฒƒ๋“ค์„ ๊ด€๋ฆฌํ•จ) ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๊ทธ ์•„๋ž˜ ์ค„์— ์žˆ๋Š” ์ฝ”๋“œ์ฒ˜๋Ÿผ getBean์„ ํ†ตํ•ด ์„ค์ •ํด๋ž˜์Šค์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค. (๋งŒ์•ฝ @Bean์ด ์—†๋‹ค๋ฉด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค)

์กฐ๊ธˆ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณด์ž. ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ์—ˆ์–ด๋„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์„ค์ •ํด๋ž˜์Šค ์† ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์•Œ๋ ค์ค˜์•ผํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— "memberService"์™€ "orderService"์ธ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ ์–ด getBean์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด๋‹ค.

๋งจ ์•ž์— MemberService์™€ OrderService๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ˜„์žฌ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฆ„์„ ๊ฐ๊ฐ memberService, orderService๋ฅผ ๋ถ™์—ฌ์คฌ๋Š”๋ฐ ๊ทธ ์ด๋ฆ„๋“ค์˜ (๊ฐ€์ ธ์˜ฌ) ํƒ€์ž…์„ ์•ž์— ์ •์˜ํ•œ ๊ฒƒ์ด MemberService์™€ OrderService๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ ํƒ€์ž…์˜ ๋งž๊ฒŒ ์ •์˜๋œ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜จ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋’ค์— ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. MemberService.class์™€ OrderService.class์™€ ๊ฐ™์ด ๋ง์ด๋‹ค. ๋งŒ์ผ  memberService ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํด๋ž˜์Šค ๋‚ด์— MemberService.class๋กœ ์ง€์ •์„ ํ•ด๋†จ๋Š”๋ฐ ํ…Œ์ŠคํŠธ์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ๋ฐ”๊ฟ€ ๊ฒฝ์šฐ ์‹ค์ œ ๋นˆ๊ณผ ๊ธฐ๋Œ€ํ•œ ๋นˆ์˜ ํƒ€์ž…์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒฐ๊ณผ ๊ฐ’์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  .class๋Š” ์•Œ๋งž๊ฒŒ ์ ์–ด๋†จ์ง€๋งŒ ๋งจ ์•ž์— MemberService์™€ OrderService๋ฅผ ๋‹ค๋ฅธ ํƒ€์ž…์„ ์ ์„ ๊ฒฝ์šฐ์—๋„ ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

 

 

 

 

- ApplicationContext ์ถœ์ฒ˜

 

[Spring] ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ(ApplicationContext)

ApplicationContext๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•œ๋‹ค.(์ •ํ™•ํžˆ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ถ€๋ฅผ ๋•Œ, BeanFactory, ApplicationContext๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ๋งํ•˜์ง€๋งŒ, BeanFactory๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค.)

velog.io

 

 

 

 


 

 

[ โ–ถ๏ธŽ ]

 

 

 

[Spring] ๊น€์˜ํ•œ ๊ธฐ๋ณธํŽธ_ ์„น์…˜ 5. ์Šคํ”„๋ง์ปจํ…Œ์ด๋„ˆ์™€์Šคํ”„๋ง๋นˆ

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋นˆ ์ด๋ฆ„๊ณผ ๋นˆ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์ค€๋‹ค. Public๊ณผ ํ•จ๊ป˜ ์“ด ๊ฒƒ์€ ํƒ€์ž…๊ณผ ์ด๋ฆ„์ด ๋œ๋‹ค. ์˜ˆ์‹œ๋กœ public MemberService memberService( )์˜ ๊ฒฝ์šฐ MemberService๋Š” ํƒ€

post-this.tistory.com

 

 

 

 

ํ˜ผ์ž ์ฒœ์ฒœํžˆ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์ ํ˜€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ฐ์•ˆํ•˜๊ณ  ๋ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ€ ๋ชจ๋‘๋“ค ํ™”์ดํŒ…ํ•˜์„ธ์š” ๐Ÿ€

 

<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

์•„์ฃผ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์˜ ๊ธฐ์ดˆ ํ‹€์„ ๋งŒ๋“œ๋Š” ๊ฐ•์˜์˜€๋‹ค. ์—ฌ๊ธฐ์—์„œ ์•Œ์•„๋‘˜ ๊ฒƒ์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด๋‹ค. ํ˜„์žฌ ๊ฐ•์˜ ์‹œ์ ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜์ง„ ๋ชปํ–ˆ๋Š”๋ฐ, ๊ทธ ๋ฌธ์ œ์ ์„ ํ†ตํ•ด ์ถ”ํ›„ ์–ด๋–ค ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•˜๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์ฒด์˜ ๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •๋ฆฝํ•ด์•ผํ• ์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ๊ฐ•์˜๊ฐ€ ์ด๋ค„์ง„๋‹ค. ์–ด์จŒ๋“  ํ˜„์žฌ ์‹œ์ ์—์„  ํ”„๋กœ์ ํŠธ์˜ ํ‹€์„ ์–ด๋–ค์‹์œผ๋กœ ์งœ์•ผํ•˜๋ฉฐ enum, interface, class๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์™œ ์žˆ๋Š”์ง€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

๐Ÿงธ

์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ ์—ˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”

 


๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๋ ˆ์ธ ๊ผฌ์šฐ- ๐Ÿงธ

โœ”๏ธ   ์ด ์„ธ๊ฐ€์ง€์˜ package๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

  • member
    ใ„ด class : Member, MemberServiceImpl, MemoryMemberRepository
    ใ„ด interface : MemberService, MemberRepository
    ใ„ด enum : Grade
  • discount
    ใ„ด class : FixDiscountPolicy
    ใ„ด interface : DiscountPolicy
  • order
    ใ„ด class : Order, OrderServiceimpl
    ใ„ด interface : OrderService

 


โœ”๏ธ  member

โ–บ  Member

ํšŒ์›์ €์žฅ์†Œ ๊ด€๋ฆฌ

 

 

GetterSetter(public)

: private ๊ฐ’์„ ์™ธ๋ถ€๋กœ ๋นผ๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.

 

id, name, grade์ธ ์ด 3๊ฐ€์ง€ private ์ •๋ณด๋ฅผ ๋„ฃ์—ˆ๋‹ค.

 

 

- GetterSetter ์ถœ์ฒ˜ 

 

[OOP] Getter์™€ Setter๋Š” ์ง€์–‘ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค

๋ชฉ์ฐจ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์–ผ๋งˆ ์ „ ์‚ฌ๋‚ด์—์„œ Getter์™€ Setter๋ฅผ ํ•จ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์„ธ๋ฏธ๋‚˜๊ฐ€ ์žˆ์—ˆ๋‹ค. Setter์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋Š” ์›Œ๋‚™ ๋งŽ์ด ์•Œ๋ ค์ ธ์žˆ์—ˆ์ง€๋งŒ Getter์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋Š” ์ž˜ ํ•˜์ง€ ์•Š

colabear754.tistory.com

 

 

 

 

โ–บ MemoryMemberRepository

ํšŒ์›์ •๋ณด๋ฅผ store์— ์ €์žฅํ•˜๋Š” ํšŒ์›์ €์žฅ์†Œ

 

 public void save(Member member) {
        store.put(member.getId(), member);
    }

 

save๋ผ๋Š” ๋ฉ”์„œ๋“œ๋Š” Member ํด๋ž˜์Šค์— ์ •์˜ํ•œ ๊ฐ์ฒด๋ฅผ ๋”ฐ๋ฅด๋ฉฐ Member์— ์žˆ๋Š” getter๋ฅผ ํ†ตํ•ด id ๊ฐ’์„ ์–ป๊ณ  ๊ทธ id ๊ฐ’์„ store์— put ํ•˜๊ฒ ๋‹ค๋Š” ๋‚ด์šฉ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— save ์•ž์— void๋ฅผ ๋ถ™์—ฌ์ค€ ๊ฒƒ์ด๋‹ค. ๋ฐ˜ํ™˜ํ•˜๋Š” ํƒ€์ž…์— void๋ฅผ ๋ถ™์—ฌ ํ˜ธ์ถœํ•œ ์ชฝ์— ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค. (ํ˜ธ์ถœ ์ชฝ์€ ๋„ฃ์–ด๋‹ฌ๋ผ ํ–ˆ์œผ๋‹ˆ ๋„ฃ์œผ๋ฉด ๋์ธ ๊ฒƒ์ด๋‹ค.)

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

  public Member findById(Long memberId) {
        return store.get(memberId);
    }

 

findById

: id๋ฅผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

id๋Š” Member ํด๋ž˜์Šค์— private Long id;๋ผ๊ณ  ์„ ์–ธ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— Map<Long, Member>๋ผ๊ณ  ์„ ์–ธํ•˜๊ณ  store์—์„œ id๋ฅผ ์ฐพ์„ ๋•Œ๋„ Long ํƒ€์ž…์œผ๋กœ ์ ์€ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด findById ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฐพ์€ id๋Š” Member ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

 

 

Q. findById์™€ getById์™€์˜ ์ฐจ์ด์ ์€?

A. ํ˜„์žฌ inteliJ์—์„œ getById๋ณด๋‹ค getReferenceById๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์œ ํ•˜๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ getReferenceById๋Š” findById์™€ ๋‹ค๋ฅด๊ฒŒ ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ null์ด ์•„๋‹Œ EntityNotFoundException ์˜ˆ์™ธ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋„๋ก ํ•˜๊ณ  ์žˆ๋‹ค.

 

 

Q. Member member์˜ Member์™€ Long memberId์˜ Long, ์™œ ํƒ€์ž…์ด ๋‹ค๋ฅธ๊ฐ€?

A. ๊ณ ๊ฐ์ด ์žˆ๋‹ค. ๊ณ ๊ฐ์˜ ์ •๋ณด๋Š” ์ด ์„ธ๊ฐ€์ง€์ธ id, name, grade๊ฐ€ ๋œ๋‹ค. ์ด ์ค‘์— ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ณ ์œ ํ•œ ๊ฐ’์€ id ๋ฟ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ณ ๊ฐ์˜ ์ •๋ณด๋ฅผ ์ฐพ๊ณ ์ž ํ•  ๋•Œ id๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Member ๊ฐ์ฒด ์† id ํ•„๋“œ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— memberId ์•ž์—” Long ํƒ€์ž…์œผ๋กœ ์ ์–ด์ค€ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  id๋ฅผ ํ†ตํ•ด ๊ณ ๊ฐ์˜ ์ •๋ณด๋ฅผ ์ฐพ์•„์˜ค๋ฉด ๊ทธ ์†์— name๊ณผ grade๋„ ํฌํ•จ๋˜์–ด ์žˆ๊ฒŒ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— Member ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

 

- findById์™€ getById์˜ ์ฐจ์ด ์ถœ์ฒ˜

 

220905 TIL getById() vs findById()

๊ธˆ์š”์ผ ์ฝ”๋”ฉ ์ธํ„ฐ๋ทฐ ์‹œ๊ฐ„์— ๋ฐ›์•˜๋˜ ์งˆ๋ฌธ ์ค‘ ์ œ๋Œ€๋กœ ๋Œ€๋‹ตํ•˜์ง€ ๋ชปํ–ˆ๋˜ ์งˆ๋ฌธ์ธ findById์™€ getById์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋ดค๋‹ค. getById ์šฐ์„  getById()๋Š” Spring Data JPA 2.7.2๋ถ€ํ„ฐ Deprecated ๋˜๊ณ  getReferenceById()๋กœ ๋ณ€๊ฒฝ์ด

seungjjun.tistory.com

 

 

 

 

 

โ–บ MemberServiceImpl

ํšŒ์›๊ฐ€์ž…๊ณผ ํšŒ์›์กฐํšŒ ํ•œ๋‹ค. (ํšŒ์›์„œ๋น„์Šค์ œ๊ณต)

 

 

[ํ…Œ์ŠคํŠธ ํ•  ๋•Œ]

// ํ…Œ์ŠคํŠธ MemberServiceTest 
MemberService memberService = new MemberServiceImpl();
...
์œ„์˜ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ํšŒ์›์ •๋ณด๊ฐ€ ๋“ค์–ด์˜จ๋‹ค.

MemberServiceImpl ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. MemberServiceImpl ํด๋ž˜์Šค๋Š” MemberService๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ MemberServiceImpl์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ MemberService์ธ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•œ ์ด์œ ๋Š” ๋‹คํ˜•์„ฑ์„ ์œ„ํ•จ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์–ด๋–ค ๊ตฌํ˜„์ฒด์™€ ์—ฐ๊ด€๋˜์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. 

MemberServiceImpl memberServiceImpl = new MemberServiceImpl( );์€ ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค. ์™œ๋ƒํ•˜๋ฉด MemberServiceImpl์— ์†ํ•ด์žˆ๋Š” ๋ฉ”์„œ๋“œ๋งŒ ์ด์šฉ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํƒ€์ž…์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋‹ค๋ฅธ ๊ตฌ์ฒด ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ์—ฌ๋„ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋ฉฐ ์œ ์ง€๋ณด์ˆ˜์—๋„ ์ข‹๋‹ค.

 

 

// MemberServiceImpl ํด๋ž˜์Šค

private final MemberRepository memberRepository = new MemoryMemberRepository();

  @Override
    public void join(Member member) {
        memberRepository.save(member);
    }
...

 

MemoryMemberRepository(ํšŒ์›์ €์žฅ์†Œ)์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ์›ํ• ํ•˜๊ฒŒ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด
'private final MemberRepository memberRepository = new MemoryMemberRepository();' ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.

์•„๊นŒ test ์ฝ”๋“œ์—์„œ ๋ณธ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํƒ€์ž… ๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ์—ฐ๊ฒฐํ•  ๊ตฌํ˜„์ฒด๋ฅผ ์„ ์–ธํ–ˆ๋‹ค. ํ›„์— ๋ฐฐ์šฐ๊ฒ ์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์“ฐ๋Š” ๋ฐฉ์‹์ด ๋งž๋Š” ๋ฐฉ์‹์€ ์•„๋‹ˆ๋‹ค. ๋งŒ์ผ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์„ ์–ธ๋˜์–ด์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ฐฉ๋ฌธํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—(์˜์กด์„ฑ ๋ฌธ์ œ) ์ด ๋ฐฉ์‹์€ ์„ ํ˜ธํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ˜„์žฌ ์ฝ”๋“œ์—์„œ final์ด ๋ถ™์–ด์žˆ๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ์„ ์–ธ๋œ ๊ตฌํ˜„์ฒด์ธ MemoryMemberRepository๋ฅผ ๋‹ค๋ฅธ ๊ตฌํ˜„ ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ถˆ๊ฐ€ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ด๋‹ค. (๋‚ด๋ถ€ ์ฝ”๋“œ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค)

memberRepository์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์—ฌ ํšŒ์›๊ฐ€์ž…์ด ๋˜๋„๋กํ•œ๋‹ค.

 

 

 

 

 


 

 

 

โœ”๏ธ  discount

     < ์กฐ๊ฑด >

  • ํ• ์ธ ์ •์ฑ…์€ ๋ชจ๋“  VIP๋Š” 1000์›์„ ํ• ์ธํ•ด์ฃผ๋Š” ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ์„ ์ ์šฉํ•ด๋‹ฌ๋ผ. (๋‚˜์ค‘์— ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ๋‹ค.)
  • ํ• ์ธ ์ •์ฑ…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ํšŒ์‚ฌ์˜ ๊ธฐ๋ณธ ํ• ์ธ ์ •์ฑ…์„ ์•„์ง ์ •ํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ์˜คํ”ˆ ์ง์ „๊นŒ์ง€ ๊ณ ๋ฏผ์„ ๋ฏธ๋ฃจ๊ณ  ์‹ถ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ• ์ธ์„ ์ ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ๋„ ์žˆ๋‹ค. (๋ฏธํ™•์ •)

 

โ–บ DiscountPolicy

: ์ผ๋ฐ˜(?) ํ• ์ธ ์ •์ฑ…

ํ™•์ •๋œ ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜๋งŒ ํ•ด์ค€๋‹ค.

 

 

โ–บ FixDiscountPolicy 

 : VIP๋Š” 1000์› ํ• ์ธ ์ •์ฑ…

 

private int discountFixAmount = 1000;
ํ• ์ธํ•  ๊ฐ€๊ฒฉ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋”ฐ๋กœ 1000์›์„ ์„ ์–ธํ•œ๋‹ค.

 

if (member.getGrade() == Grade.VIP) {
            return discountFixAmount;
discount ๋ฉ”์„œ๋“œ๋Š” Member์™€ price๋ฅผ ๋ฐ›๋Š”๋‹ค.(Member member, int price) ๊ทธ๋ ‡๊ฒŒ Member ํด๋ž˜์Šค์— ์žˆ๋Š” getGrade๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๊ธ‰์ด VIP์ด๋ฉด discountFixAmount๋ฅผ ๋ฆฌํ„ดํ•˜์—ฌ ๊ฐ€๊ฒฉ์˜ 1000์›์„ ํ• ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

 

 

 


 

โœ”๏ธ  order

 

โ–บ Order

: ๊ณ ๊ฐ์˜ ์ฃผ๋ฌธ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ตœ์ข… ๊ธˆ์•ก ๊ณ„์‚ฐ

 

public Order(Long memberId, String itemName, int itemPrice ,int discountPrice) {
        this.memberId = memberId;
        this.itemPrice = itemPrice;
        this.itemName = itemName;
        this.discountPrice = discountPrice;
    }

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ์ธ์ž๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ ์ธ์ž๋ฅผ ๋ฐ›์•„ ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด Order ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋Š” ์ผ์ด๋‹ค. 

์ธ์ž์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์œ„์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(memberId, itemName ๋“ฑ) ์•ˆ์— ๊ตฌ์ฒด์ ์ธ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ๋œ๋‹ค. ๊ทธ๊ฒƒ์„ ์ธ์ž๋ผ๊ณ  ํ•˜๋Š”๋ฐ

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

public Long getmemberId() {
	return memberId;
}

public String getItemName() {
	return itemName;
    }
getter๋ฅผ ์ด์šฉํ•˜์—ฌ memberId์™€ ItemName์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” Order ํด๋ž˜์Šค์—์„œ ๋ณ€์ˆ˜๋ฅผ private์œผ๋กœ ์ •์˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Order ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์™ธ๋ถ€ ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ๊ฐ์ฒด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์œผ๋ฉด getter๋ฅผ ํ†ตํ•ด์•ผํ•œ๋‹ค. 

๋งŒ์•ฝ getter๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์™ธ๋ถ€ ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด, ์•ž์—์„œ ๋ดค๋“ฏ์ด order.getmemberId();๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

public String toString() {
        return "Order{" +
                "memberId=" + memberId +
                ", itemName='" + itemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", discountPrice=" + discountPrice +
                '}';
    }
toString์€ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 

 

 

 

Q. ๋งŒ์•ฝ toString์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ถœ๋ ฅ์ด ๋ ๊นŒ?

 

Order order = new Order(1L, "Laptop", 1000, 100);
System.out.println(order);โ€‹

 

A. ์˜ˆ์ œ๋กœ chat-GPT๊ฐ€ ๋งŒ๋“ค์–ด์คฌ๋‹ค. ์ถœ๋ ฅ๊ฒฐ๊ณผ๋Š” [ Order@5e2de80c ] ์ด๋ ‡๊ฒŒ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.
์ฆ‰, toString์„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด memberId,itemname,itemprice,discountprice๊ฐ€ ์ญˆ์šฑ- ์ถœ๋ ฅ๋˜์–ด ๊ฒฐ๊ณผ๊ฐ’์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

โ–บ OrderServiceImpl

: ์ฃผ๋ฌธ ๊ณ ๊ฐ์„ ํ™•์ธํ•˜์—ฌ ๋“ฑ๊ธ‰์— ๋งž๋Š” ํ• ์ธ์ •์ฑ…์„ ์ ์šฉ ํ•œ๋‹ค.

 

    private final MemberRepository memberRepository = new MemoryMemberRepository();
    private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
์ฃผ๋ฌธ ๊ณ ๊ฐ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ์— ๋งž๋Š” ํ• ์ธ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์„ ์–ธํ–ˆ๋‹ค. ๊ตฌํ˜„์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ ๋ฐ”๊พธ๋Š” ๊ฑธ ์™ธ๋ถ€์—์„œ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก final๋กœ ์ •์˜ํ–ˆ๋‹ค.

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

 @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);
}
createOrder๋ผ๋Š” ๋ฉ”์„œ๋“œ๋กœ ๋ฐ˜ํ™˜ํƒ€์ž…์€ Order๊ฐ€ ๋œ๋‹ค. ์ด๊ฑธ ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ OrderServiceTest๋ฅผ ๋ณด๋ฉด Order order = orderService.createOrder(memberId, "itemA", 10000);์ด๋ž€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

์ธ์ž๊ฐ€ createOrder๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋งž์ถฐ ๋“ค์–ด์˜ค๊ณ  memberId๋Š” memberRepository๋กœ ๋“ค์–ด๊ฐ€ ํšŒ์› ์ •๋ณด๋ฅผ ์ฐพ๋Š”๋‹ค.(ํšŒ์›์ •๋ณด ์ฐพ๋Š” ๊ฒƒ์„ ํ†ตํ•ด ํšŒ์› ๋“ฑ๊ธ‰, ํšŒ์› ์ด๋ฆ„ ๋“ฑ์„ ์•Œ์•˜์„ ๊ฒƒ์ด๋‹ค.) ๊ทธ๋ฆฌ๊ณ  ์–ป์–ด๋‚ธ ํšŒ์› ์ •๋ณด(member)์™€ ์ƒํ’ˆ ๊ฐ€๊ฒฉ์„ ๊ฐ€์ง€๊ณ  discountPolicy์— ์žˆ๋Š” discount ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•˜๋ฉด ํšŒ์› ๋“ฑ๊ธ‰์ด VIP์ธ ๊ฒฝ์šฐ 1000์›์„ ํ• ์ธํ•˜๋ผ๋Š” ์ฝ”๋“œ์— ๋งž์ถฐ discountFixAmount๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ 1000์›์ด๋ž€ ๊ฐ’์„ ํ• ์ธํ•œ๋‹ค๋Š” ์ •๋ณด๊ฐ€ discountPrice์— ์ €์žฅ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ Order(์ฃผ๋ฌธ์„ ๋ฐ›์•„ ์ตœ์ข… ๊ณ„์‚ฐํ•˜๋Š” ํด๋ž˜์Šค)์—์„œ ์š”๊ตฌํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋งž๋Š” ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋‹ค์‹œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋กœ ๊ฐ€๊ฒ ๋‹ค. Assertions.assertThat(order.getDiscountPrice( )).isEqualTo(1000);์ด ์žˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” getDiscountPrice๊ฐ€ 1000์›์ด๋ž‘ ๋™์ผํ•œ์ง€์— ๋Œ€ํ•ด ๋ฌป๋Š” ์ฝ”๋“œ์ธ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ ์•„๊นŒ ์œ„์— ์žˆ๋˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ Order์— ์žˆ๋Š” ๊ฐ์ฒด ์ •๋ณด๋“ค์„ order์— ๋„ฃ๊ณ  Order ํด๋ž˜์Šค์— ์žˆ๋Š” getDiscountPrice ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ’ private์œผ๋กœ ์„ ์–ธ๋œ ํ• ์ธ ๊ฐ’์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.  ๊ทธ๋ ‡๊ฒŒ 1000์›์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ๋œ ๊ฒƒ์ด๋‹ค.

 

 

[ โ–ถ๏ธŽ ]

 

 

[Spring] ๊น€์˜ํ•œ ๊ธฐ๋ณธํŽธ_ ์„น์…˜ 4. ๊ฐ์ฒด์ง€ํ–ฅ์›๋ฆฌ์ ์šฉ

์„น์…˜ 3. ์˜ˆ์ œ๋งŒ๋“ค๊ธฐ์—์„œ ์ž ๊น ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ๊ตฌํ˜„์ฒด์˜ ์˜์กด์„ฑ์„ ์™„์ „ํžˆ ๋ฐฐ์ œํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํ•˜๋‚˜ํ•˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„๊ฐ€ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ• 

post-this.tistory.com

 

 

 

 

ํ˜ผ์ž ์ฒœ์ฒœํžˆ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๋‚ด์šฉ์ด ์ ํ˜€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๊ฐ์•ˆํ•˜๊ณ  ๋ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ€ ๋ชจ๋‘๋“ค ํ™”์ดํŒ…ํ•˜์„ธ์š” ๐Ÿ€

+ Recent posts