inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 DB 1편 - 데이터 접근 핵심 원리

트랜잭션 문제 해결 - 트랜잭션 매니저1

transactionManager 주입 질문

424

나마스테

작성한 질문수 24

0

안녕하세요 강사님, 강의보면 멤버리파짓토리V2와 플랫폼트랜잭션매니저

이렇게 2개를 주입받고있는데 2개이상일때 생성자를 정의 안해도 되는건가요? 스프링 1편에서는 RequiredArgsConstructor 같은경우에 필드가 한개일때만 자동생성 된다고 배우고 두개 이상일때는 생성자를만들어야하는거로 기억하고있어서요 ㅠㅠ

spring

답변 1

0

y2gcoder

안녕하세요. 김보겸님, 공식 서포터즈 y2gcoder입니다.

MemberServiceV2와 같은 코드를 보고 말씀하시는 것으로 이해했습니다.

먼저 Lombok의 @RequiredArgsConstructor는 final 키워드나 @NotNul이 붙은 필드의 생성자를 자동으로 만들어주는 애노테이션입니다.

그리고 말씀해주신 스프링 1편의

RequiredArgsConstructor 같은경우에 필드가 한개일때만 자동생성 된다고 배우고 두개 이상일때는 생성자를만들어야하는거로 기억하고있어서요 ㅠㅠ

이 부분은 아마 생성자를 통한 의존성 주입의 내용으로 보입니다. 생성자를 통한 의존성 주입때는 기본적으로 생성자 위에 @Autowired를 붙여 의존성 주입을 해주고 있습니다. 그런데 생성자가 1개일 때는 스프링에서 @Autowired를 자동으로 붙여줍니다. 생성자가 2개 이상이라면 스프링에서 어느 생성자에 @Autowired를 붙여줘야 할지 모르기 때문에 명시적으로 의존성 주입에 이용할 생성자에 @Autowired를 붙여줘야 합니다. 아마 이 부분과 혼동하신 것이 아닐까 생각합니다. @RequiredArgsConstructor는 본질적으로 생성자를 편하게 생성해주는 롬복 애노테이션으로서, 의존성 주입과는 직접적인 관련이 없습니다!

 

감사합니다.

0

나마스테

아 영상 속에서는 private final PlatformTranscationManager transactionManager;

private final MemberRepositoryV2 memberRepository;
이렇게 2개의 필드가 있던데 위 2개의 필드는 의존성 주입이 아니라 그냥 필드만 만들고 사용하는 의미인건가요?

1

y2gcoder

final 키워드가 있는 변수는 반드시 초기화해줘야 합니다.

그래서 서비스 클래스의 위에 보시면 @RequiredArgsConstructor 롬복 애노테이션이 존재합니다 :)

그리고 해당 롬복 애노테이션은

private final PlatformTranscationManager transactionManager;
private final MemberRepositoryV2 memberRepository;

public MemberServiceV2(PlatformTranscationManager transactionManager, 
    MemberRepositoryV2 memberRepository) {
    this.transactionManager = transactionManager;
    this.memberRepository = memberRepository;
}

라는 생성자를 만들어주는 것과 동일합니다.

그리고 스프링은 이렇게 빈으로 등록된 클래스의 생성자가 하나있을 때

자동으로 해당 생성자 위에 @Autowired를 붙여줘서 생성자를 통한 의존성 주입을 가능하게 해주는 것입니다 :)

private final PlatformTranscationManager transactionManager;
private final MemberRepositoryV2 memberRepository;

@Autowired
public MemberServiceV2(PlatformTranscationManager transactionManager, 
    MemberRepositoryV2 memberRepository) {
    this.transactionManager = transactionManager;
    this.memberRepository = memberRepository;
}

해당 내용이 이해가 가지 않으신다면 스프링 핵심 원리 기본편을 다시 천천히 복습해보시는 것을 추천합니다:)

 

0

나마스테

우선 항상 감사드립니다 ㅠㅠ 롬복 어노테이션 사용하면 자동생성자 만들어지고 만약 생성자가 2개 이상이면 @Autowired를 수동으로 붙여줘야하는걸로 알았는데 수동으로 안붙여도 되는군요 .. 감사합니다!

1

y2gcoder

엇!

생성자가 바로 저

public MemberServiceV2(PlatformTranscationManager transactionManager, 
    MemberRepositoryV2 memberRepository) {
    this.transactionManager = transactionManager;
    this.memberRepository = memberRepository;
}

이런 메서드 하나가 생성자 하나라고 보시면 됩니다.

그래서 위는 생성자가 하나인 것이고 하나기 때문에 스프링에서 자동으로 @Autowired를 붙여줄 수 있는 것입니다.

생성자가 2개라는 말은

public MemberServiceV2() {}
public MemberServiceV2(PlatformTranscationManager transactionManager, 
    MemberRepositoryV2 memberRepository) {
    this.transactionManager = transactionManager;
    this.memberRepository = memberRepository;
}

이와 같이 해당 생성자 메서드가 2개임을 말합니다!

1

나마스테

앗!! 제가 잘못알고있었네요!! 너무감사드립니다!!

0

y2gcoder

파이팅입니다!!

spring initialiser 어떤걸 선택해야될지 모르겠어요

0

38

2

트랜잭션 템플릿이 체크예외는 커밋하는 이유가 궁금합니다.

0

51

1

jdbc 학습하다 궁금해서 질문드려요

0

85

1

정상이체와 이체중 예외발생 차이

0

70

2

이번 강의부터가 JDBC 직접 사용 맞나요?

0

89

1

순수한 서비스 계층에 대한 의문???

0

83

2

3_4test, 4test 자동 리소스 안됨

0

60

2

데이터베이스 선택 관련 질문.

0

71

2

after 메서드 사용 유무

0

60

2

데이터베이스 접근 및 DB 락

0

57

1

@SpingBootTest, @TestConfiguration

0

58

1

Read Committed 격리 수준 사용 관련 질문

0

52

1

AopCheck Test 부분의 EnhancerBySpring 확인 법??

0

69

2

커리큘럼 관련 질문

0

78

1

서비서 계층 스프링 프레임워크 사용

0

89

1

validation(toMember)의 위치

0

84

2

데이터 계층에서 서비스 로직의 datasource를 인식하는 방법

0

166

2

member 상수 질문

0

124

2

ctrl + F6 이후로 con 인식이 안 됩니다

0

154

2

DrivenManager 와 Connection 반환에 대한 질문입니다!

0

110

1

섹션5 트랜잭션 템플릿관련 질문(이기종 DB)

0

116

1

세션1 테이블 조회결과 그림은 Redo 로그에 속하나요?

0

103

1

트랜잭션이 필요하지 않은 경우 DB 대신 파일 시스템을 사용하는 것이 더 효율적인가?

0

98

1

강의 14분쯤 Exception 질문

0

116

2