[Spring] 스프링 DI 사용 시 생성자 주입을 사용하자!

2022. 4. 27. 18:22·💻 개발/프레임워크
728x90
반응형
👉🏻  Spring에서는 DI기능을 제공합니다. 이는 Applicaiton 시작 시 IOC에 Bean으로 설정된 Object를 관리하고, Singleton 형태로 '@Autowired' 되어있는 객체에 주입이 됩니다. 주입 방식에는 기본적으로 필드주입, Setter주입, 생성자 주입이 있으며 현재까지는 생성자 주입이 가장 안정적인 방법으로 알려져 있습니다.

그 이유를 살펴보겠습니다. [일반 메서드 주입도 있으나 잘 사용하지 않거나 Setter와 비슷하여 제외]

Setter 주입

  • DI를 Setter 함수에서 실행하는 방법
  • 선택, 변경 가능성이 있는 의존관계에서 사용
@Slf4j
@Service
public class MemberService{

private MemberMapper MemberMapper;

    @Autowired
    public void setMemberMapper(MemberMapper memberMapper) {
			this.MemberMapper = memberMapper;
		}
...

 

Field 주입 

  • DI를 field에 직접 주입 하는 방법
  • 코드의 간결함이 장점
  • 외부 변경이 불가능하기 때문에 Test code 작성 시 실행이 힘듬 
  • DI Framwork가 없으면 아무것도 할 수 없음 
@Slf4j
@Service
public class EmailService{

	@Autowired
    private SmsMapper smsMapper;
..

생성자 주입

  • DI를 생성자에서 실행하는 방법
  • 생성자 호출 시점에 딱 1번 호출 되는 것이 보장 
    • 1번 호출 보장은 데이터 보존에 유리함 -> 외부 접근 할 수 있는 곳이 한 곳이니까
  • 불편, 필수 의존 관계에 사용 
  • Spring 프레임 워크가 밀고 있음
  • 생성자가 1개인 경우 @Autowired를 생략해도 주입이 가능
  •  
@Service 
public class UserServiceImpl implements UserService {
	private UserRepository userRepository; 
	private MemberService memberService;
    
    public UserServiceImpl(UserRepository userRepository, MemberService memberService) { 
    this.userRepository = userRepository;
    this.memberService = memberService;
    } 
   }

생성자 주입을 사용해야하는 이유 

불변

  • 대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 
    오히려 대부분의 의존관계는 애플리케이션 종료전까지 변하면 안된다. 불변의 법칙
  • 수정자 주입을 사용하면, setXxx메서드를 public으로 열어두어야 한다.
  • 누군가 실수로 변경할 수도 있고, 변경하면 안되는 메서드를 이용해서 에러가 날 수 있다.
  • 생성자 주입은 객체를 딱 1번만 호출하므로 이후에 호출 되는 일이 없다. 따라서 불변하게 설계할 수 있다

final키워드

생성자 주입을 사용할 때 final 키워드를 사용할 수 있다. 

final을 사용하면 생성자에서 혹시라도 값이 설정하지 않을 경우 오류 메시지를 뱉는다. 

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'💻 개발 > 프레임워크' 카테고리의 다른 글

[Spring] application-oauth.yml를 .gitIgnore에 등록하지않고 보안을 유지하고, 깃허브 액션을 사용해서 빌드 방법  (0) 2023.01.05
[Spring] 내가 헷갈려서 정리한 @RestController @Controller @Response @RequestParam @RequestBody @ModelAttribute정리  (0) 2022.07.17
[오류해결]template might not exist or might not be accessible by any of the configured Template Resolvers  (2) 2022.07.07
@Transactional에 대해 / @Transactional(readOnly = false) @Transactional(readOnly = true) 차이  (0) 2022.06.23
@PutMapping이용시 오류메시지 해결하기 / not-null property references a null or transient value  (0) 2022.05.27
'💻 개발/프레임워크' 카테고리의 다른 글
  • [Spring] 내가 헷갈려서 정리한 @RestController @Controller @Response @RequestParam @RequestBody @ModelAttribute정리
  • [오류해결]template might not exist or might not be accessible by any of the configured Template Resolvers
  • @Transactional에 대해 / @Transactional(readOnly = false) @Transactional(readOnly = true) 차이
  • @PutMapping이용시 오류메시지 해결하기 / not-null property references a null or transient value
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (110)
      • 🌟🙇🏻‍♂️ 꼭 읽어봤으면 하는 글 (4)
      • 💻 개발 (73)
        • 설정 및 세팅 (4)
        • DB&서버&네트워크&암호 (11)
        • React (0)
        • JPA, Querydsl (14)
        • 알고리즘 (7)
        • 언어 (15)
        • 프레임워크 (12)
        • HTML, CSS (10)
      • ✍🏻 (32)
        • 회고록 (14)
        • 독서록 (7)
        • 일지록 (10)
        • 세미나 (1)
      • 💡 리뷰 (1)
        • 제품리뷰 (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
foodev
[Spring] 스프링 DI 사용 시 생성자 주입을 사용하자!
상단으로

티스토리툴바