https://github.com/jiholee0/hello-spring
[์คํ๋ง ๋น์ ๋ฑ๋กํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ]
1. ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์
2. ์๋ฐ ์ฝ๋๋ก ์ง์ ์คํ๋ง ๋น ๋ฑ๋ก
์ค๋ฌด์์๋ ์ฃผ๋ก ์ ํํ๋ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ๊ฐ์ ์ฝ๋๋ ์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํํ ๋์ง ์๊ฑฐ๋, ์ํฉ์ ๋ฐ๋ผ ๊ตฌํ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ฉด ์ค์ ์ ํตํด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
1. ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์
@Component ์ ๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋๋ค. @Controller @Service @Repository ์ ๋ ธํ ์ด์ ๋ ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋๋ค.
@Controller
package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Service
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
/* ์ฝ๋ ์๋ต */
}
@Repository
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import java.util.*;
@Repository
public class MemoryMemberRepository implements MemberRepository {
/* ์ฝ๋ ์๋ต */
}
์์ฑ์์ @Autowired ๊ฐ ์์ผ๋ฉด ์คํ๋ง์ด ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์์ ์ฐพ์์ ๋ฃ์ด์ค๋ค. ์ด๋ ๊ฒ ๊ฐ์ฒด ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ DI (Dependency Injection), ์์กด์ฑ ์ฃผ์ ์ด๋ผ ํ๋ค. @Autowired ๋ฅผ ํตํ DI๋ ์คํ๋ง์ด ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์์๋ง ๋์ํ๋ค. ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ์ง ์๊ณ ๋ด๊ฐ ์ง์ ์์ฑํ ๊ฐ์ฒด์์๋ ๋์ํ์ง ์๋๋ค.
๐ก DI (Dependency Injection), ์์กด์ฑ ์ฃผ์
DI์๋ ํ๋ ์ฃผ์ , setter ์ฃผ์ , ์์ฑ์ ์ฃผ์ ์ด๋ ๊ฒ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ์์กด๊ด๊ณ๊ฐ ์คํ์ค์ ๋์ ์ผ๋ก ๋ณํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ผ๋ฏ๋ก ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅํ๋ค.
- ํ๋ ์ฃผ์
@Autowired
private MemberService memberService;
- setter ์ฃผ์
public MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
- ์์ฑ์ ์ฃผ์
public final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
2. ์๋ฐ ์ฝ๋๋ก ์ง์ ์คํ๋ง ๋น ๋ฑ๋ก
@Service, @Repository, @Autowired ์ ๋ ธํ ์ด์ ์ ์ง์ฐ๊ณ ์ง์ ์๋ฐ ๋น์ ๋ฑ๋กํ๋ค.
package hello.hellospring;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}