목차
728x90
반응형
섹션3 회원 관리 예제 - 백엔드 개발
회원 서비스 개발
- 서비스 클래스: 리포지토리와 도메인을 이용해 실제 비즈니스 로직을 작성하는 클래스
- Optional
- ifPresent(람다식): 인자가 true면 표현식을 실행한다
private void validateDuplicateMember(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원입니다"); }); }
- ifPresent(람다식): 인자가 true면 표현식을 실행한다
회원 서비스 테스트
- 테스트에서 사용할 메서드의 이름을 한글로 지정해도 됨
- 테스트 코드를 작성할 때 given-when-then의 문법을 이용하면 이해가 쉬움
- given: 이런 상황이 주어졌을 때
- when: 검증할 때
- then: 이런 액션이 나와야 한다
- 테스트는 정상 플로우보다 예외 플로우가 훨씬 중요하다 어떤 테스트를 진행할 때 예외가 발생하게 유도하고 해당 예외가 발생하면 어떻게 처리할지를 작성한다
- try-catch를 사용하는 경우
@Test void 중복_회원_가입() { // given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); try { memberService.join(member2); Assertions.fail("예외가 발생해야 합니다."); } catch (IllegalStateException e) { // then Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다"); } }
- Assertions.assertThrows를 사용하는 경우: 람다식 후가 실행되고 람다식 전에 선언한 예외 클래스가 발생하면 테스트 성공
@Test void 중복_회원_가입() { // given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); // then IllegalStateException e = assertThrows( IllegalStateException.class, () -> memberService.join(member2) ); Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다"); }
- try-catch를 사용하는 경우
- @BeforeEach: 클래스가 동작할 때 다른 메서드가 동작하기 전에 가장 먼저 실행되는 메서드를 지정함
섹션4 스프링 빈과 의존관계
컴포넌트 스캔과 자동 의존관계 설정
- 컨트롤러는 서비스 객체를 이용해 데이터를 조회할 수 있어야함. 이러한 관계를 의존 관계가 있다, 컨트롤러가 서비스를 의존한다고 표현함
- 컨트롤러를 통해서 외부 요청을 받고 서비스에서 비즈니스 로직을 만들고 리포지토리에서 데이터를 저장하는 패턴을 사용하려면 각 객체마다 아래 어노테이션을 작성한다
- @Controller: 스프링 컨테이너가 해당 어노테이션을 갖는 컨트롤러를 찾아 객체를 생성하고 스프링이 관리함
- @Service: 컨트롤러에서 서비스를 쓸 때 단순히 생성만 하지 말고 서비스 클래스에 해당 어노테이션을 지정해야 스프링이 서비스라고 인식함
- @Repository: 서비스에서 리포지토리를 객체를 사용하기 위해 스프링에게 해당 클래스가 리포지토리 클래스임을 알림
- 위의 어노테이션들은 @Component 어노테이션을 내장하고 있기 때문에 이 방식을 컴포넌트 스캔이라고 한다.
- @Autowired: 필요한 객체를 직접 연결함. new를 이용해 객체를 생성하지 않아도 됨. 생성자에 해당 어노테이션을 작성하면 클래스가 생성될 때 스프링 빈에 등록된 생성자에서 필요로 하는 객체를 가져와 주입함(DI, Defendency Injection).
- 참고로 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본적으로 싱글턴으로 등록한다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스다.
자바 코드로 직접 스프링 빈 등록하기
- 컨트롤러 클래스를 생성하고 @Autowired를 하지 않는다
@Controller public class MemberController { private final MemberService service; @Autowired public MemberController(MemberService service) { this.service = service; } }
- @Configuration 어노테이션을 가지는 클래스를 생성하고 연결될(wired) 메서드에 @Bean 어노테이션을 지정한다
@Configuration public class SpringConfig { @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public MemberService memberService() { return new MemberService(memberRepository()); } }
- DI(Defendecy Injection)에는 필드 주입, 세터 주입, 생성자 주입 세가지 방법이 있다.
- 필드 주입 방법은 권장하지 않는다
- 세터 주입 방법의 경우 세터 메서드가 public으로 공개되어 있어야 한다. 문제 발생 가능성이 다분하기 때문에 권장하지 않는다
- 생성자 주입 방법을 주로 권장한다. 의존 관계가 실행 중에 동적으로 변하는 경우가 거의 없기 때문
728x90
반응형
728x90
반응형
섹션3 회원 관리 예제 - 백엔드 개발
회원 서비스 개발
- 서비스 클래스: 리포지토리와 도메인을 이용해 실제 비즈니스 로직을 작성하는 클래스
- Optional
- ifPresent(람다식): 인자가 true면 표현식을 실행한다
private void validateDuplicateMember(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원입니다"); }); }
- ifPresent(람다식): 인자가 true면 표현식을 실행한다
회원 서비스 테스트
- 테스트에서 사용할 메서드의 이름을 한글로 지정해도 됨
- 테스트 코드를 작성할 때 given-when-then의 문법을 이용하면 이해가 쉬움
- given: 이런 상황이 주어졌을 때
- when: 검증할 때
- then: 이런 액션이 나와야 한다
- 테스트는 정상 플로우보다 예외 플로우가 훨씬 중요하다 어떤 테스트를 진행할 때 예외가 발생하게 유도하고 해당 예외가 발생하면 어떻게 처리할지를 작성한다
- try-catch를 사용하는 경우
@Test void 중복_회원_가입() { // given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); try { memberService.join(member2); Assertions.fail("예외가 발생해야 합니다."); } catch (IllegalStateException e) { // then Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다"); } }
- Assertions.assertThrows를 사용하는 경우: 람다식 후가 실행되고 람다식 전에 선언한 예외 클래스가 발생하면 테스트 성공
@Test void 중복_회원_가입() { // given Member member1 = new Member(); member1.setName("spring"); Member member2 = new Member(); member2.setName("spring"); // when memberService.join(member1); // then IllegalStateException e = assertThrows( IllegalStateException.class, () -> memberService.join(member2) ); Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다"); }
- try-catch를 사용하는 경우
- @BeforeEach: 클래스가 동작할 때 다른 메서드가 동작하기 전에 가장 먼저 실행되는 메서드를 지정함
섹션4 스프링 빈과 의존관계
컴포넌트 스캔과 자동 의존관계 설정
- 컨트롤러는 서비스 객체를 이용해 데이터를 조회할 수 있어야함. 이러한 관계를 의존 관계가 있다, 컨트롤러가 서비스를 의존한다고 표현함
- 컨트롤러를 통해서 외부 요청을 받고 서비스에서 비즈니스 로직을 만들고 리포지토리에서 데이터를 저장하는 패턴을 사용하려면 각 객체마다 아래 어노테이션을 작성한다
- @Controller: 스프링 컨테이너가 해당 어노테이션을 갖는 컨트롤러를 찾아 객체를 생성하고 스프링이 관리함
- @Service: 컨트롤러에서 서비스를 쓸 때 단순히 생성만 하지 말고 서비스 클래스에 해당 어노테이션을 지정해야 스프링이 서비스라고 인식함
- @Repository: 서비스에서 리포지토리를 객체를 사용하기 위해 스프링에게 해당 클래스가 리포지토리 클래스임을 알림
- 위의 어노테이션들은 @Component 어노테이션을 내장하고 있기 때문에 이 방식을 컴포넌트 스캔이라고 한다.
- @Autowired: 필요한 객체를 직접 연결함. new를 이용해 객체를 생성하지 않아도 됨. 생성자에 해당 어노테이션을 작성하면 클래스가 생성될 때 스프링 빈에 등록된 생성자에서 필요로 하는 객체를 가져와 주입함(DI, Defendency Injection).
- 참고로 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본적으로 싱글턴으로 등록한다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스다.
자바 코드로 직접 스프링 빈 등록하기
- 컨트롤러 클래스를 생성하고 @Autowired를 하지 않는다
@Controller public class MemberController { private final MemberService service; @Autowired public MemberController(MemberService service) { this.service = service; } }
- @Configuration 어노테이션을 가지는 클래스를 생성하고 연결될(wired) 메서드에 @Bean 어노테이션을 지정한다
@Configuration public class SpringConfig { @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public MemberService memberService() { return new MemberService(memberRepository()); } }
- DI(Defendecy Injection)에는 필드 주입, 세터 주입, 생성자 주입 세가지 방법이 있다.
- 필드 주입 방법은 권장하지 않는다
- 세터 주입 방법의 경우 세터 메서드가 public으로 공개되어 있어야 한다. 문제 발생 가능성이 다분하기 때문에 권장하지 않는다
- 생성자 주입 방법을 주로 권장한다. 의존 관계가 실행 중에 동적으로 변하는 경우가 거의 없기 때문
728x90
반응형