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

2022. 4. 27. 18:22·📂 Backend Engineering
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
반응형
저작자표시 비영리 변경금지 (새창열림)

'📂 Backend Engineering' 카테고리의 다른 글

[프로그래머스Level1] 핸드폰 번호 가리기 - 자바(java)  (0) 2022.06.04
@PutMapping이용시 오류메시지 해결하기 / not-null property references a null or transient value  (0) 2022.05.27
[JavaScript] 프로미스와 프로미스 API구조  (0) 2021.10.19
[Python] 중복단어 삭제하기(연속적으로 나오는 경우/ 전체 단어 중 삭제)  (0) 2021.09.03
[Python] 전체 글 목록에서 헤더 푸터 자르기 / pdftotex, 함수 만들기  (0) 2021.07.18
'📂 Backend Engineering' 카테고리의 다른 글
  • [프로그래머스Level1] 핸드폰 번호 가리기 - 자바(java)
  • @PutMapping이용시 오류메시지 해결하기 / not-null property references a null or transient value
  • [JavaScript] 프로미스와 프로미스 API구조
  • [Python] 중복단어 삭제하기(연속적으로 나오는 경우/ 전체 단어 중 삭제)
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (104) N
      • ⭐ Featured (4)
      • 📂 Backend Engineering (36)
      • 📂 Troubleshooting & Ops (10)
      • 📂 Infra & System (7) N
      • 📂 Reflections (21)
        • Year-in-Review (5)
        • Work & Career (10)
        • Lessons Learned (6)
      • 📂 Team Journal (10)
      • 📂 Archive (16)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    githubaction 라벨 ci/cd
    인프라 로그 저장 비용 감소하는 방법
    di동작원리
    창업패키지후기
    validation failed (numeric string is expected)
    스냅샷과히스토리성 차이
    해피해킹 꿀팁
    di란
    db 날린 썰
    typedi 동작원리
    azure ci/cd
    nestjs pipe
    해피해킹 카라비너
    해피해킹 방향키
    Azure log 비용 줄이기
    서이추
    스냅샷과 히스토리
    db 날림
    해피해킹 커스텀
    githubaction 라벨 배포
    토이프로젝트개발일지
    해피해킹 키매핑
    nestjs pipe body
    Azure 로그 최소 저장 30일
    di의존성
    db 초기화
    개발썰
    typedi란
    QueryDSL
    JPA
  • 최근 댓글

  • 최근 글

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

티스토리툴바