geeone 스터디 블로그

[Spring] 강의 스터디 WIL 4주차 본문

Spring

[Spring] 강의 스터디 WIL 4주차

alisongeeone 2024. 11. 3. 00:08
1. 회원 서비스 개발 
2. 회원 서비스 테스트 
3. 컴포넌트 스캔과 자동 의존관계 설정
4. 자바 코드로 직접 스프링 빈 등록하기 

1. 회원 서비스 개발 

서비스 클래스(비즈니스 매서드들) 작성하기

  • 자주 쓰는건 method로 빼기 : Control + T , extract method
  • MemberService.java
package hello.hello_spring.service;

import hello.hello_spring.domain.Member;
import hello.hello_spring.repository.MemberRepository;
import hello.hello_spring.repository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    public Long join(Member member){
        validateDuplicateMember(member); // 중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m ->{ //null이 아니라 어떠한 값이 있으면
                   throw new IllegalStateException("이미 존재하는 회원입니다.");
                 });
    }

    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }
}

 

2. 회원 서비스 테스트 

- 편리하게 테스트 하는 방법

→ Class에서 command+shift+T

- 테스트는 이름을 한글로 적어도 됨. (테스트 코드는 실제 코드에 빌드 될 때 포함되지 않음.)

- 테스트 추천 tip

→ given, when, then

@Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("hello");

        //when
        Long saveId = memberService.join(member);

        //then
        Member findMember=memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());

    }
    @Test
    public void 중복_회원_예외(){
        //given
        Member member1=new Member();
        member1.setName("spring");

        Member member2=new Member();
        member2.setName("spring");
        //when
        memberService.join(member1);
        assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        //then
    }
   MemoryMemberRepository memberRepository = new MemoryMemberRepository();

    @AfterEach //테스트가 하나 끝날 때마다 콜백 되어서 실행됨.
    public void afterEach(){
        memberRepository.clearStore();
    }

- DB 정리해주는 것 잊지 말기 

 

3. 컴포넌트 스캔과 자동 의존관계 설정

회원 컨트롤러에 의존 관계 추가

package hello.hellospring.controller;
 import hello.hellospring.service.MemberService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 @Controller
 public class MemberController {
     private final MemberService memberService;
     @Autowired
     public MemberController(MemberService memberService) {
         this.memberService = memberService;
     }
}

생성자에 `@Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다.

- 이전 테스트에서는 개발자가 직접 주입했고여기서는 @Autowired에 의해 스프링이 주입해준다.

 


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

회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션을 제거하고 진행 한다.

 package hello.hellospring;
 import hello.hellospring.repository.MemberRepository;
 import hello.hellospring.repository.MemoryMemberRepository;
 import hello.hellospring.service.MemberService;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 @Configuration
 public class SpringConfig {
 	@Bean
     public MemberService memberService() {
         return new MemberService(memberRepository());
     }
     @Bean
     public MemberRepository memberRepository() {
         return new MemoryMemberRepository();
     }
}