[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
  • 전체
    오늘
    어제
    • 분류 전체보기 (103)
      • ⭐ Featured (4)
      • 📂 Backend Engineering (36)
      • 📂 Troubleshooting & Ops (10)
      • 📂 Infra & System (7)
      • 📂 Reflections (20)
        • Year-in-Review (4)
        • Work & Career (10)
        • Lessons Learned (6)
      • 📂 Team Journal (10)
      • 📂 Archive (16)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바