-

[스프링부트 및 JPA] - @RequiredArgsContructor과 @Autowired를 이용한 DI 본문

백엔드 기술 정리/스프링 부트

[스프링부트 및 JPA] - @RequiredArgsContructor과 @Autowired를 이용한 DI

흣차 2022. 2. 4. 02:56
728x90
반응형

이번에 해볼 것은 이전에 만든 SingupDto의 변수 4가지를 User라는 모델에 담을 것입니다.

이전에 살펴봤든 User라는 모델은

이렇게 많은 변수를 가지고 있었고

SignupDto에는 고작 4가지의 변수만 가지고 있기 때문에 이것들을 다 담으려면 DTO를 이용해서 함수를 하나 만드는 것이 가장 좋습니다.

그러므로 제일 먼저 User클래스에서

@Builder라는 어노테이션을 붙힙니다.

그리고 SignupDto로 이동해서 이렇게 입력합니다.

이 @Builder 어노테이션은 쉽게 말해 클래스에게 빌더 패턴을 적용시켜서 정적 메서드로 구현되는 빌더객체를 생성시켜줍니다.

따라서 우리가 User의 toEntity()메서드를 만들 때 이 @Builder만 User에게 붙혀주어도 여기서 파생되는 여러가지 메서드를 자유롭게 만들 수 있습니다.

우리는 toEntity()라는 메서드로 총 4가지의 변수만 받는 작업을 할 것이기 때문에 4가지만 입력합니다.

자 그래서 생성한 toEntity()함수를 실행하여 user에 담아오게할 수 있습니다.

이제부터 이 갖고온 user를 DB에 넣어보겠습니다.

DB에 넣는 작업은 Service에서 할 수 있습니다. 그래서 

이렇게 만들어줍니다.

이전의 포스팅을 보신 분들은 아시겠지만 이 Service클래스들에게는 위에 @Service어노테이션을 달아줌으로써 여러가지 기능을 스프링부트에서 지원해주고 있습니다.

첫 번째로 IoC에 등록할 수 있고 두 번째로 트랜잭션을 관리할 수 있게 도와줍니다.

자 그런데 우리가 이 Service를 통해 사용할 기능은 받아온 데이터를 가지고 DB에 넣는(Repository에 넣는) 작업이 필요하잖아요?

그러므로 JpaRepository도 생성합니다. 

이렇게, domain.user라는 패키지에 UserRepository를 인터페이스로 생성합니다.

그리고 JpaRepository를 상속받아야 하기 때문에 

이렇게 입력해주고 각 제네릭 타입은 User와 Integer로 받아줍니다.

이렇게 해주면 어노테이션이 없어도 IoC등록이 자동으로 된다는 장점이 있습니다.

무엇때문일까요?

바로 JpaRepository를 상속하면 자동으로 스프링부트에서 등록해줍니다!

신기하네요!

그럼 거의 다 되었습니다.

AuthService에서 회원가입을 해야하니까 이를 AuthController에서 요청해야합니다.

그러니까 Controller -> Service -> Repository의 패턴을 사용해야 한단 뜻입니다.

그러므로 요청할 때 DI에서 불러오는 작업이 필요한데 이를 Controller에서 수행합니다.

AuthController로 이동하겠습니다.

그리고 이렇게 입력합니다.

이것을 사용하는 이유는 간단합니다.

AuthService에 있는 기능을 사용하고 싶은데 그럴려면 AuthService가 계속 IoC에 떠있어야 합니다.

그 작업을 바로 @RequiredArgsConstrutor를 걸어줌으로써 아주 간단히 사용할 수 있습니다.

이걸 달면 final이 걸려 있는 모든 생성자를 만들 수 이습니다.

원래 자바에서는 final이 붙어있는 전역변수는 초기화를 무!조!건! 해주어야 합니다.

하지만 이 @RequiredArgsConstructor 어노테이션을 이용하여 굳이 초기화해주지 않더라도 이것을 이용할 수 있습니다.

이 작업을 DI (Dependency Injection)라고 합니다. 

만약 이렇게 안한다 한다면 다른 방법이 있는데,

이 방법을 통해서도 DI를 사용할 수 있습니다.

대신 조금 귀찮잖아요??

그래서 가장 간단한 방법은 

@Autowired만 이용해서 final을 입력하지 않고서라도 authService를 IoC에 띄울 수 있습니다.

굉장히 간단하죠? 계속 살펴보도록 하겠습니다.

회원가입을 마무리 해야합니다.

DI를 사용해야 하기 때문이지요. 제일 밑으로 내려가서

요렇게 방금 부른 authService에서 회원가입메서드를 user를 넣고 실행합니다.

그리고 AuthService로 가서

이렇게 입력합니다.

AuthService클래스는 DB에 데이터를 넣는 작업을 할 것이기 때문에 UserRepisory를 DI로 주입해야합니다.

그러므로 이번엔 @Service위에 @RequiredArgsConstructor를 달았습니다.

이후

userEntity에 userRepository.save(user)를 하여 데이터를 담습니다.

그런데 save메서드를 잘 보시면

return타입이 S입니다.

즉, user를 넣었으므로 user가 반환됩니다.

그러므로 단순히 userRepository.save(user)로 끝날 것이 아니라 userEntity에 값을 담아옵니다.

외부에서 통신을 통해 받는 것은 user이고 DB에 있는 데이터값을 받아오기 때문에 userEntity라고 붙혔습니다.

간단하죠?

이후 

이렇게, 회원가입 메서드의 타입을 User로 바꾸고 userEntity를 return하도록 바꿉니다.

자 그래서 마지막으로 회원가입을 AuthController에서 실행하여 마무리 짓겠습니다.

이렇게 작성해주면 회원가입이 되겠죠???

자 다음시간엔 이 DB에 들어간 값을 암호화해서 넣는 작업을 해보도록 하겠습니다.

감사합니다.

728x90
반응형
Comments