๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Spring

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜ˆ์ œ๋งŒ๋“ค๊ธฐ - ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„, ๊ฐœ๋ฐœ, ์‹คํ–‰, ํ…Œ์ŠคํŠธ)

by YeonBu 2023. 10. 18.
728x90

 

/* ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๋ ค๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

   ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์˜ฌ๋ฆฌ๋Š” ๊ธ€์ด๋ฏ€๋กœ ์ค‘๊ฐ„ ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. */

 

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์„ฑ์žฅํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์„ธ์š”! ๐Ÿ“ข

www.inflearn.com

 

 

 

ํšŒ์› ๋„๋ฉ”์ธ

 

 

 

1. ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„

 

ํšŒ์› ๋„๋ฉ”์ธ ํ˜‘๋ ฅ ๊ด€๊ณ„

 

โ—พ ํด๋ผ์ด์–ธํŠธ์˜ ์—ญํ•  : ํšŒ์›์„œ๋น„์Šค ํ˜ธ์ถœ

โ—พ ํšŒ์›์„œ๋น„์Šค์˜ ์—ญํ•  : ํšŒ์›๊ฐ€์ž… / ํšŒ์›์กฐํฌ ์ด ๋‘ ๊ฐ€์ง€์˜ ๊ธฐ๋Šฅ

โ—พ ํšŒ์›์ €์žฅ์†Œ์˜ ์—ญํ•  : ์„ธ๊ฐ€์ง€ ์ €์žฅ์†Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ํšŒ์› ๊ด€๋ฆฌ

                                    [ DB ํšŒ์› ์ €์žฅ์†Œ(์ž์ฒดDB) / ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์—ฐ๋™ ํšŒ์› ์ €์žฅ์†Œ ] 

                                    ์ด ๋‘˜ ์ค‘ ์–ด๋–ค ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ๋ฏธํ™•์ •์ด๊ธฐ ๋•Œ๋ฌธ์—

                                    ๋ฉ”๋ชจ๋ฆฌ ํšŒ์› ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰(๋กœ์ปฌ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ ์ง„ํ–‰์šฉ)

 

 

 

ํšŒ์› ํด๋ž˜์Šค ๋‹ค์ด์–ด ๊ทธ๋žจ

 

โ—พ ํšŒ์› ์„œ๋น„์Šค = MemberService <interface>

โ—พ ํšŒ์› ์„œ๋น„์Šค์˜ ๊ตฌํ˜„์ฒด = MemberServiceImpl

โ—พ ํšŒ์› ์ €์žฅ์†Œ = MemberRepository <interface>

โ—พ ํšŒ์› ์ €์žฅ์†Œ์˜ ๊ตฌํ˜„์ฒด = MemoryMemberRepository / DbMemberRepository

 

๐Ÿ’ก ์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ–ˆ๋˜ ์ 

: ์ €์žฅ์†Œ๋Š” ๋‚˜์ค‘์— ๊ต์ฒดํ•˜๊ธฐ์œ„ํ•ด Interface๋กœ ์ถ”์ƒํ™” ํ•˜๋Š”๊ฑด ์ดํ•ด๊ฐ€ ๊ฐ€๋‚˜ Service๋Š” ๊ต์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š”๋ฐ ์ถ”์ƒํ™”๋ฅผ ํ•˜๋Š” ์ด์œ ๋Š”? ์ด ๊ถ๊ธˆํ–ˆ๋Š”๋ฐ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ธํ”„๋Ÿฐ์— ์งˆ๋ฌธ์„ ํ–ˆ๊ณ , ๊น€์˜ํ•œ๋‹˜์ด ๋‹ต๋ณ€ํ•œ๊ฒŒ ์žˆ์–ด์„œ ์ฐธ์กฐ

 

๋ˆ„๊ตฐ๊ฐ€ ์ด ์งˆ๋ฌธ์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋˜ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ใ…Žใ…Ž
์ œ๊ฐ€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง ๋งˆ์ง€๋ง‰์—์„œ ๋ง์”€๋“œ๋ ธ๋˜ ๋‚ด์šฉ์ด ๊ธฐ์–ต๋‚˜์‹ค๊บผ์—์š”.
* ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ์„ค๊ณ„์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ€์—ฌํ•˜์ž

 

์‹ค๋ฌด ๊ณ ๋ฏผ
* ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ถ”์ƒํ™”๋ผ๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.
* ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๋ฉด, ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ ,

  ํ–ฅํ›„ ๊ผญ ํ•„์š”ํ•  ๋•Œ ๋ฆฌํŒฉํ„ฐ๋งํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๋‹ค.


๊ฐ•์˜์—์„œ๋Š” ์ด์ƒ์ ์œผ๋กœ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถ”์–ด์„œ ์ด๋Ÿฐ ๋ถ€๋ถ„๋“ค๋„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
์ €๋„ ์‹ค๋ฌด์—์„œ๋Š” ๊ต์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ์„œ๋น„์Šค ํด๋ž˜์Šค๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค๋กœ ๋ฐ”๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค^^

 

 

 

 

ํšŒ์› ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ

 

โ—พ ๊ฐ์ฒด ๋‹ค์ด์–ด ๊ทธ๋žจ : ์‹ค์ œ ์„œ๋ฒ„์— ์˜ฌ๋ผ์™”์„ ๋•Œ ๊ฐ์ฒด๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๋ฅผ ๊ทธ๋ฆฐ ๊ฒƒ

โ—พ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ทธ๋ฆผ

 

 

 

 

 

2. ํšŒ์› ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ

 

 

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);
    }

}

 

๐Ÿ’ก ๊ถ๊ธˆ์ฆ 1

: store๋ฅผ ๋งŒ๋“ค ๋•Œ static์„ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š”?

 

static ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ค๋กœ์ง€ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด ๊ฐ„์— ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๊ณต์œ ํ•˜๋Š”๋ฐ ์šฉ์ดํ•˜๋‹ค.

์ด๋Ÿฌํ•œ static์˜ ํŠน์ง•์„ ์ด์šฉํ•˜์—ฌ ๋‹จ ํ•˜๋‚˜์˜ Map์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด static์œผ๋กœ Map์„ ์ƒ์„ฑํ•œ ๊ฒƒ.

๋งŒ์•ฝ static์„ ์ œ๊ฑฐํ•œ๋‹ค๋ฉด new MemberRepository(); ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Map์ด ์ƒ์„ฑ๋˜์–ด ๊ฐ์ฒด๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์˜ Map์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

 

๐Ÿ’ก ๊ถ๊ธˆ์ฆ 2

: store๋ฅผ HashMap์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์‹œ์„ฑ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ConcurrentHashMap์œผ๋กœ ์ƒ์„ฑํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค. ์˜ˆ์ œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด HashMap์œผ๋กœ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ๋‘˜์˜ ์ฐจ์ด์ ์€?

 

HashMap๊ณผ ConcurrentHashMap์€ ๋‘˜๋‹ค 'key-value' ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

 

HashMap

  - ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰๋“ฑ์˜ ์—ฐ์‚ฐ์ด ๋น ๋ฅด๋‹ค

  - null ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค

  - ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

 

ConcurrentHashMap

  - ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝํ•ด์„œ HashMap๋ณด๋‹ค ๋” ๋น ๋ฅธ ์†๋„๋กœ ๋™์ž‘ํ•œ๋‹ค.

  - null ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค

  - ๋ฉ€ํ‹ฐ์Šค๋ ˆํŠธ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ ‘๊ทผํ•ด๋„ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.

 

 

 

 

 

 

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 null;
    }
    
}

 

๐Ÿ’ก ๊ถ๊ธˆ์ฆ 1

: memberRepository๋ฅผ ๋งŒ๋“ค ๋•Œ final๋กœ ์„ ์–ธํ•œ ์ด์œ ?

 

  โ—พ ๋ถˆ๋ณ€์„ฑ(Immutability): final ํ•„๋“œ๋Š” ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๋ฉด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ์ด๊ฒƒ์€ ํ•„๋“œ์— ๋Œ€ํ•œ ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ํ•„๋“œ ๊ฐ’์„ ๋ณดํ˜ธํ•œ๋‹ค. memberRepository๊ฐ€ ํ•œ ๋ฒˆ ์„ค์ •๋˜๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

  โ—พ ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ(Thread Safety): final ํ•„๋“œ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— memberRepository๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ๋™์‹œ ์ ‘๊ทผ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

  โ—พ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ: final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•ด์ง„๋‹ค. memberRepository๊ฐ€ ํ•œ ๋ฒˆ ์„ค์ •๋˜๊ณ  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์€ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

  โ—พ ์˜ค๋ฅ˜ ๋ฐฉ์ง€: final๋กœ ์„ ์–ธ๋œ ํ•„๋“œ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, ๋Ÿฐํƒ€์ž„ ์ค‘์— ๋‹ค์‹œ ์„ค์ •๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

 

 

 

 

 

3. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

 

์œ„์น˜ ์ค‘์š”

โ—พ ๋‚˜์ค‘์— ๋นŒ๋“œํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๋น ์ง„๋‹ค๊ณ  ํ•จ!

 

 

 

 

 

MemberServiceTest

 

package hello.core.member;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class MemberServiceTest {

    @Test
    void join() {

        MemberService memberService = new MemberServiceImpl();

        // given
        Member member = new Member(1L, "memberA", Grade.VIP);

        // when
        memberService.join(member);
        Member findMember = memberService.findMember(1L);

        // then
        Assertions.assertThat(member).isEqualTo(findMember);

    }

}

 

โ—พ Assertions Importํ•  ๋•Œ "org.assertj.core.api.Assertions" ์ด๊ฑธ๋กœ!

 

 

๐Ÿ’ก ๊ถ๊ธˆ์ฆ 1

: Assertions์˜ ๊ธฐ๋Šฅ๊ณผ assertThat์˜ ๊ธฐ๋Šฅ ์ข…๋ฅ˜

 

Assertions์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ํŠน์ • ์กฐ๊ฑด์ด ์ฐธ์ด์–ด์•ผ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ณ„์† ์ง„ํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ฉฐ assertThat์€ ๋‹ค์–‘ํ•œ ๋น„๊ต ๋ฐ ๊ฒ€์ฆ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

assertThat ๋ฉ”์„œ๋“œ ์ข…๋ฅ˜

String ex1 = "hello wolrd";

String ex2 = "hello wolrd";

โ—พ assertThat(ex1).isEqualTo(ex2); / isNotEqualTo(ex1); : ๋‘ ๊ฐ’์ด ๊ฐ™์€์ง€ / ๋‹ค๋ฅธ์ง€ ๋น„๊ต

โ—พ assertThat(ex1).isNull(); / isNotNull(); : ๊ฐ’์ด null์ธ์ง€ / null์ด ์•„๋‹Œ์ง€ ํ™•์ธ

โ—พ assertThat(ex1).istrue(); / isfalse(); : ๊ฐ’์ด true์ธ์ง€ / false์ธ์ง€ ํ™•์ธ

โ—พ assertThat(ex1).startWith("hello") / endsWith("wolrd") : ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘, ๋ ํ™•์ธ

โ—พ assertThat(ex1).contains("hello") : ๋ฌธ์ž์—ด ํŠน์ •๋ถ€๋ถ„์— ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธ

๋“ฑ๋“ฑ ๋งŽ์œผ๋‹ˆ๊นŒ ์ฐพ์•„๋ณด๊ธฐ

 

 

 

 

4. ์„ค๊ณ„์˜ ๋ฌธ์ œ์ 

 

โ—พ ์ด ์ฝ”๋“œ๋Š” ์˜์กด๊ด€๊ณ„๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„๊นŒ์ง€ ๋ชจ๋‘ ์˜์กดํ•˜๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์Œ

 

private final MemberRepository memberRepository = new MemoryMemberRepository();

 

์—ฌ๊ธฐ์„œ MemberRepository๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€๋งŒ ์‹ค์ œ ํ• ๋‹นํ•˜๋Š” ๋ถ€๋ถ„์€ ๊ตฌํ˜„์ฒด๋ฅผ ์˜์กดํ•˜๊ณ  ์žˆ์Œ

์ถ”์ƒํ™”์—๋„ ์˜์กดํ•˜๊ณ  ๊ตฌํ˜„์ฒด์—๋„ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ = DIP ์œ„๋ฐ˜

โž” ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์€ '์ฃผ๋ฌธ'๊นŒ์ง€ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ์„ค๋ช…ํ•ด์ฃผ์‹ ๋‹ค๊ณ  ํ•จ.

 

 

 

 

 

๋ฐ˜์‘ํ˜•

'IT > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ)  (0) 2023.10.20
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ, ์ ์šฉ, ๋ฌธ์ œ์ )  (2) 2023.10.20
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜ˆ์ œ๋งŒ๋“ค๊ธฐ - ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ์„ค๊ณ„, ๊ฐœ๋ฐœ, ์‹คํ–‰, ํ…Œ์ŠคํŠธ)  (0) 2023.10.20
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(์˜ˆ์ œ๋งŒ๋“ค๊ธฐ - ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ, ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์„ค๊ณ„)  (0) 2023.10.18
[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] ์ธํ”„๋Ÿฐ ๊ฐ•์˜ ์ •๋ฆฌ(๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ SOLID, ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง)  (0) 2023.10.17