📖/spring(김영한)

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 3일차

2023. 8. 1. 11:21
목차
  1. 섹션3 회원 관리 예제  - 백엔드 개발
  2. 회원 서비스 개발
  3. 회원 서비스 테스트
  4. 섹션4 스프링 빈과 의존관계
  5. 컴포넌트 스캔과 자동 의존관계 설정
  6. 자바 코드로 직접 스프링 빈 등록하기
728x90
반응형

섹션3 회원 관리 예제  - 백엔드 개발

회원 서비스 개발

  • 서비스 클래스: 리포지토리와 도메인을 이용해 실제 비즈니스 로직을 작성하는 클래스
  • Optional
    • ifPresent(람다식): 인자가 true면 표현식을 실행한다
      private void validateDuplicateMember(Member member) {
      	memberRepository.findByName(member.getName())
      		.ifPresent(m -> {
      			throw new IllegalStateException("이미 존재하는 회원입니다");
      		});
      }

회원 서비스 테스트

  • 테스트에서 사용할 메서드의 이름을 한글로 지정해도 됨 
  • 테스트 코드를 작성할 때 given-when-then의 문법을 이용하면 이해가 쉬움
    • given: 이런 상황이 주어졌을 때
    • when: 검증할 때
    • then: 이런 액션이 나와야 한다
  • 테스트는 정상 플로우보다 예외 플로우가 훨씬 중요하다 어떤 테스트를 진행할 때 예외가 발생하게 유도하고 해당 예외가 발생하면 어떻게 처리할지를 작성한다
    1. 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("이미 존재하는 회원입니다");
      	}
      }
    2. 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("이미 존재하는 회원입니다");
      }
  • @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
반응형
저작자표시 (새창열림)
  1. 섹션3 회원 관리 예제  - 백엔드 개발
  2. 회원 서비스 개발
  3. 회원 서비스 테스트
  4. 섹션4 스프링 빈과 의존관계
  5. 컴포넌트 스캔과 자동 의존관계 설정
  6. 자바 코드로 직접 스프링 빈 등록하기
'📖/spring(김영한)' 카테고리의 다른 글
  • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 5일차
  • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 4일차
  • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 2일차
  • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 1일차
모팔구
모팔구
250x250
모팔구
내가 개발자가 될 수 있 을 가?
모팔구
전체
오늘
어제

공지사항

  • 블로그 이사왔읍니다🙇‍♂️
  • allofthem
    • 🖥️
      • 시험 접수 시스템
    • 📖
      • Hello Coding 프로그래밍
      • 자바의 정석(~ing)
      • spring(김영한)
    • 💭
      • KDT
    • 💡
      • ⛔️ 에러

블로그 메뉴

  • 🪀 amideveloper.log
  • 방명록
  • 태그

인기 글

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.
모팔구
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 3일차
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.