Spring

TIL Spring 2-2

린예쑰 2023. 12. 8. 02:29

IoC&DI

κΈ°μ‘΄ ν”„λ‘œμ νŠΈμ— μ μš©ν•΄λ³΄κΈ°


# IoC&DI λŠ” Spring 핡심 기술둜 각각 섀계 원칙, λ””μžμΈ νŒ¨ν„΄μ„ λœ»ν•œλ‹€.

μ™œ 이것을 μ œκ³΅ν•˜λŠ”κ°€? 쒋은 μ½”λ“œλ₯Ό μœ„ν•΄ μ œκ³΅ν•œλ‹€.

더보기

<쒋은 μ½”λ“œλž€?>

  •   논리가 간단해야 ν•œλ‹€.
  • 쀑볡을 μ œκ±°ν•˜κ³  ν‘œν˜„μ„ λͺ…ν™•ν•˜κ²Œ ν•œλ‹€.
  • μ½”λ“œλ₯Ό 처음 λ³΄λŠ” μ‚¬λžŒλ„ μ‰½κ²Œ μ΄ν•΄ν•˜κ³  μˆ˜μ •ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
  • μ˜μ‘΄μ„±μ„ μ΅œμ†Œν™”ν•΄μ•Ό ν•œλ‹€.
  • μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ ν•˜λ”λΌλ„ 크게 ꡬ쑰의 변경이 μ—†μ–΄μ•Ό ν•œλ‹€.

이 νŒŒνŠΈμ—μ„œ κ°€μž₯ μ€‘μš”ν•œ ν‚€μ›Œλ“œλŠ” μ˜μ‘΄μ„±, μ£Όμž… 이 두가지이닀!

κ°•ν•œκ²°ν•©μΌμˆ˜λ‘ μ½”λ“œ λ‚΄μ—μ„œ μ–΄λ–€ 뢀뢄을 λ³€κ²½ν•˜λ €κ³  ν•  λ•Œ μ½”λ“œλ₯Ό λŠμž„μ—†μ΄ μˆ˜μ •ν•΄μ•Ό ν•œλ‹€. (λΉ„νš¨μœ¨μ )

 

#μ˜μ‘΄μ„±

κ·Έλž˜μ„œ 이 κ°•ν•œ 결합을 μ•½ν•˜κ²Œ λ§Œλ“€μ–΄μ•Όν•œλ‹€.

interface λ‹€ν˜•μ„±μ˜ 원리λ₯Ό 톡해 μ•½ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€!

 

- μΈν„°νŽ˜μ΄μŠ€ 생성

-  μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ κ΅¬ν˜„μ²΄ λ§Œλ“€κΈ°.

 

# μ£Όμž…

-  κ·Έλ ‡κ²Œ 미리 λ§Œλ“€μ–΄μ§„ κ΅¬ν˜„μ²΄λ₯Ό μž…λ§›μ— 맞게 쏙쏙 λ„£μ–΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ 됨. (νŠΉμ • 객체에 ν•„μš”λ‘œ ν•˜λŠ” 객체λ₯Ό μ „λ‹¬ν•΄μ£ΌλŠ” 것.)

 

#μ œμ–΄μ˜ μ—­μ „!

κ°•ν•œ κ²°ν•© -  κ°μ²΄μ—μ„œ ν˜ΈμΆœν•˜λŠ” λ‚΄μš©μ΄ λ‹¬λΌμ§ˆ λ•Œλ§ˆλ‹€ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λŠμž„μ—†μ΄ μˆ˜μ •ν•΄μ•Όν•¨.

μ˜μ‘΄μ„± μ£Όμž… - 미리 λ§Œλ“€μ–΄λ‘” 것을 λ•Œμ— 맞게 λ„£μ–΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ λ˜λŠ” κ²ƒμž„. λΆˆν•„μš”ν•œ μƒμ„±μ΄λ‚˜ λ©”μ„œλ“œ λ‚΄μš© μˆ˜μ •μ„ μ•ˆ 해도 됨! 

 

κ²°κ΅­ 이것도 

DIλ₯Ό 톡해 IoC 섀계 원칙을 지켰닀. 라고 이야기 ν•  수 μžˆλŠ” 것!


<Ioc, DI 직접 μ μš©ν•΄λ³΄κΈ°!>

- μ μš©ν•˜κΈ° μ „, 2-1 μ—μ„œ Service, Controller κ°κ°μ—μ„œ 반볡되던 μ½”λ“œλ₯Ό 쀄여볼 것이닀.

MemoRepository memoRepository = new MemoRepository(jdbcTemplate);

- 객체 쀑볡 생성 μ½”λ“œκ°€ λ°˜λ³΅λœλ‹€! 

 

# MemoService κ°€ 생성될 λ•Œ MemoRepositoryλ₯Ό λ”± ν•œλ²ˆ μƒμ„±ν•΄μ„œ 계속 μ‚¬μš©ν•˜κ²Œ λ§Œλ“€μ–΄λ³΄μž

public class MemoService {
   
	// 멀버 λ³€μˆ˜ μ„ μ–Έ
    private final MemoRepository memoRepository;

    // μƒμ„±μž: MemoService(JdbcTemplate jdbcTemplate)κ°€ 생성될 λ•Œ 호좜됨
	public MemoService(JdbcTemplate jdbcTemplate) {
				// 멀버 λ³€μˆ˜ 생성
        this.memoRepository = new MemoRepository(jdbcTemplate);
    }
    
   public MemoResponseDto createMemo(MemoRequestDto requestDto) {
				// RequestDto -> Entity
        Memo memo = new Memo(requestDto);

        // DB μ €μž₯
        Memo saveMemo = memoRepository.save(requestDto);

        // Entity -> ResponseDto
        MemoResponseDto memoResponseDto = new MemoResponseDto(saveMemo);

        return memoResponseDto;
    }
	...
}

-> MemoServcieκ°€ μƒμ„±μžλ₯Ό 톡해 생성될 λ•Œ νŒŒλΌλ―Έν„°λ‘œ jdbc λ°›μ•„μ˜€κ³ 

 μ•„λž˜ this. ~ μ½”λ“œλ₯Ό 톡해 Repository 객체λ₯Ό λ”± ν•˜λ‚˜ λ§Œλ“€μ–΄μ€€λ‹€. 

 

μ΄λ ‡κ²Œ ν•΄μ£Όλ©΄ λ©”μ„œλ“œ ν˜ΈμΆœν• λ•Œλ§ˆλ‹€ jdbc μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€!

 


# κ°•ν•œ κ²°ν•© -> μ•½ν•œ κ²°ν•©μœΌλ‘œ λ§Œλ“€μ–΄μ£ΌκΈ°

<T.S.2-1> μ½”λ“œμ—μ„œ μ œμ–΄μ˜ 흐름은 Controller -> Repository λ°©ν–₯으둜 흐λ₯΄κ³  μžˆλ‹€. (μ»¨νŠΈλ‘€λŸ¬μ—μ„œ μ„œλΉ„μŠ€ 직접 생성, μ„œλΉ„μŠ€μ—μ„œ 레포

지토리 직접 생성)

 

이 경우의 문제점 

Repositoryμ—μ„œ μƒμ„±μž λ³€κ²½μ‹œ 문제점 -> Con, Ser λ‹€ μˆ˜μ •ν•΄μ•Όν•¨

 

-> 미리 λ§Œλ“€μ–΄μ§„ 객체λ₯Ό λ°›μ•„μ„œ μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ μˆ˜μ •ν•΄λ³΄μž.

객체λ₯Ό new ν•΄μ„œ λ§Œλ“œλŠ” 것이 μ•„λ‹Œ 기쑴에 λ§Œλ“€μ–΄μ§„ 것을 λ°›μ•„μ„œ μ‚¬μš©ν•˜κ²Œλ”

Class Service1 {
	private final Repository1 repitory1;

	// repository1 객체 μ‚¬μš©
	public Service1(Repository1 repository1) {
		//this.repository1 = new Repository1(); μ•„λž˜μ™€ 같이 λ³€κ²½!!
		this.repository1 = repository1;
	}
}

// 객체 생성
Service1 service1 = new Service1(repository1);

 

+ Controller 도 λ§ˆμ°¬κ°€μ§€! μ΄λ ‡κ²Œ 변경이 되면

 

repository 객체λ₯Ό 생성할 λ•Œ DB 접속 id, pwλ₯Ό μƒμ„±μž 뢀뢄에 μΆ”κ°€ν•΄μ£Όλ©΄ λœλ‹€!

public class Repository1 {

	public Repository1(String id, String pw) { //μ΄λ ‡κ²Œ!
    // DB μ—°κ²°
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/memo", id, pw);
  }
}

// 객체 생성
String id = "root";
String pw = "1234";
Repository1 repository1 = new Repository1(id, pw);

 

μ΄λ ‡κ²Œ κ°•ν•œκ²°ν•©μ„ μ•½ν•œκ²°ν•©μœΌλ‘œ!

이제 Repository의 μƒμ„±μž 변경은 λ’€μ£½λ°•μ£½ μˆ˜μ •μ„ λΆ€λ₯΄μ§€ μ•ŠλŠ”λ‹€!

 

-> μ œμ–΄μ˜ 흐름이 λ°”κΎΌ 것을 λ³Ό 수 μžˆλ‹€! μ˜μ‘΄μ„± μ£Όμž…μ„ 톡해 μ œμ–΄μ˜ 흐름을 μ—­μ „ν–ˆλ‹€!

'Spring' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

TIL Spring #2-4  (0) 2023.12.12
TIL Spring #2-3  (0) 2023.12.12
TIL Spring 2-1  (1) 2023.12.07
TIL Spring 1-3  (0) 2023.12.06
TIL Spring 1-2  (0) 2023.12.05