dev/백엔드

스프링 스터디 3주차

wosrn 2024. 11. 3. 18:12

스프링 스터디 3주차 : 김영한의 스프링 입문강의 11,12,13,14강

 

11강 회원 서비스 개발

회원 리포지토리,도메인 활용하여 실제 비즈니스 로직 작성

 

기본 코드는 위와 같고, 추가적으로 

 

중복 회원 검증 코드를 위와 같이 따로 메소드로 뺄 수도 있다

 

서비스는 비즈니스에 의존적인 네이밍을, 리포지토리는 기계적인 용어들을 사용

 

전체회원조회 기능도 구현

 

 

 

12강 회원서비스테스트

ctrl + shift + t 단축키!

 

해당 단축키를 누르면, 테스트를 이렇게 간편하게 하도록 도와준다

 

 

테스트를 원하는 메소드를 클릭하고 확인을 누르면, 위와같이 테스트클래스 기본코드를 작성해준다

 

 

위와같이 바디를 작성하고 테스트를 하면, 잘 되는걸 확인할수있다

 

 

중복회원을 등록시키지 않는 기능이 잘 작동되는 지에 대한 테스트

 

try-catch보다 더 간결한 문법 : assertThrows : join(member2)라는걸 실행했을때 IllegalStateException이라는 예외가 실행되어야한다는 의미

 

메세지가 반환되기에 메세지 검증도 가능

 

이렇게 계속 db를 쌓으면서 테스트하기만 한다면, 추후 같은 이름으로 테스트가 불가능해진다

따라서 테스트 끝날때마다 db 날려주기 위해 afterEach함수 사용

 

**service클래스에서의 멤버리포지토리와, 테스트클래스에서의 멤버리포지토리가 다른 객체인 상황(각각 new사용)

이를 해결하기 위해, 

서비스클래스의 주석부분 코드를 위와 같이 바꾸고

 

테스트클래스 코드를 이렇게 바꿔준다

 

memberService 입장에서 보면, 본인이 직접 new 하지 않고 외부에서 객체를 넣어줌

= 의존성 주입!

 

 

<스프링 빈과 의존관계>

13강 컴포넌트 스캔과 자동 의존관계 설정

 

화면을 붙이고 싶은데, 그러려면 컨트롤러와 뷰 템플릿 필요

컨트롤러를 만들어서 컨트롤러가 서비스를 통해 회원가입/조회 등을 해야함 = 서로 의존관계가 있다

 

이렇게 컨트롤러 어노테이션을 붙여두면, 스프링 컨테이너가 이를 자동으로 객체 생성+관리한다

출처 - 김영한의 스프링 입문강의 강의자료

 

이때 멤버서비스 객체를 하나만 생성하기 위해 생성자와 @Autowired 어노테이션 활용

이때 멤버서비스 객체를 원활히 찾기 위해 멤버서비스 클래스에 @Service 어노테이션을 붙여준다

 

컨트롤러와 서비스를 연결하는건 autowired 어노테이션의 기능 = 의존관계 주입

 

서비스클래스에도 이 어노테이션을 붙여준다

여기까지 하면 위의 그림이 완성됨(셋의 연결)

 

이렇게 하고 main메소드를 실행하면 잘 된다

 

"스프링 빈 등록하는 2가지 방법"

- 컴포넌트 스캔과 자동 의존관계 설정 : 위에서 한 방식 (@service라는 에노테이션 안에 컴포넌트가 등록돼있음! service가  컴포넌트의 특수한 형태 중 하나인 것) - 스프링이 처음 실행될 때 컴포넌트를 실행해서 컴포넌트 어노테이션이 붙어있는 것들을 다 객체를 생성하여 컨테이너에 등록 / autowired는 이들간의 연관관계를 정의

- 자바 코드로 직접 스프링 빈 등록하기

 

** 스프링은 스프링 컨테이너에 빈을 등록할때, 기본적으로 싱글톤으로 등록한다(하나만 등록해서 공유한다)

 

 

14강 자바 코드로 직접 스프링 빈 등록하기

위의 방식으로 @Configuration, @Bean을 이용해서 직접 등록한다

 

**의존성 주입에는 우리가 위애서 이용한 생성자를 통한 주입, 필드를 통한 주입(중간에 수정이 어려워서 권장되지 않음), setter 방식(setter를 퍼블릭하게 노출해야한다는 단점-누구나 호출/변경할 수 있도록 열려있게됨)이 있다 -> 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자를 통한 주입 방식이 가장 권장됨 (조립 시점에만 한번 들어오고 끝

남)

** 주로 컴포넌트 스캔 방식을 사용하나, 상황에 따라 구현클래스가 교체되어야 하면 스프링 빈 직접 등록 방식을 선택(구현체 메모리를(db를) 추후에 바꾸기위해)

**@Autowired를 통한 di는 helloController,MemberService등과 같이 스프링이 관리하는 객체에서만 동작함! 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에선 동작하지 않음

 

'dev > 백엔드' 카테고리의 다른 글

gdg on campus ewha - Spring WIL 6주차  (0) 2024.11.17
스프링 스터디 4주차  (1) 2024.11.10
gdg on campus ewha - Spring WIL 4주차  (0) 2024.10.06
스프링 스터디 2주차  (0) 2024.10.05
스프링 스터디 1주차  (0) 2024.10.04