My footsteps
김영한 '스프링 입문' / 3 본문
- Optional을 쓰면 null일때도 감싸서 반환할수있기때문에 if조건문에서 null일때~ 이런조건문을 쓰지않아도 되서 훨씬 코드가 간결해진다
//final:한번값을 설정하면 바꿀수없음.회원가입이라서 파이널로 했나봄
private final MemberRepository memberRepository = new MemoryMemberRepository();
public Long join(Member member){
Optional<Member> result = memberRepository.findByName(member.getName());
result.ifPresent(m ->{
throw new IllegalStateException("이미 존재하는 회원 이름입니다.");
});
memberRepository.save(member);
return member.getId();
}
회원가입 로직인데 ifPresent는 옵셔널의 내장메서드중 하나로 객체에 값이 존재할 경우에만 람다식을 실행한다
m은 별의미없는 그냥 변수이름임. IllegalStateException는 수많은 예외클래스중 하나인데.. 굳이 이걸 안써도 되지만 지금 로직에선 이게 적합한거라고함. 흠 어렵넹

ct+sf+t : 테스트레포지토리 자동생성 인텔리제이 단축키
테스트 메서드는 걍 한글로 적어도 무방함
void 회원가입() {
// given = 주다
Member member = new Member();
member.setName("안녕");
// when = 어디서
Long saveId = memberService.join(member);
// then = 그다음에,그러면
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
then에서 맨마지막줄 어설트 로직은 이미 저장되어있는 아이디(saveId)가 있으면 안되게 하는..중복검사 테스트 로직이라고 보면됨
public void 중복회원예외() {
// given = 주다
Member member1 = new Member();
member1.setName("박개똥");
Member member2 = new Member();
member2.setName("박개똥");
// when = 어디서
memberService.join(member1);
try {
memberService.join(member2);
fail();
// 예외처리 실패 (중복을 잡아내야 하는데 못잡았으니까)
}catch (IllegalStateException e){
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원 이름입니다.");
// 메세지도 기존 서비스랑 똑같이 적어줘야 테스트 오류 안남
}
}
이런방법도있는데 트라이캐치문을 적어줘야해서 별로 비추천
// (이 예외가 터져야함,이 로직을 실행했을때)
트라이캐치 아예 지우고 이 한줄로 이렇게 바꿀수도 있다! 오옹..
테스트할때 레포지토리객체를 new로 매번 만드니까 그냥 서비스에서
this.memberRepository = memberRepository;
}
이렇게 외부에서도 접근할수있게 해주고 (이과정이 DI다)
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach(){
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
멤버서비스테스트에는 이렇게 수정해준다. @beforeEach가 테스트 실행되기 전에 제일 먼저 실행되게 해줌
컴포넌트 스캔과 자동 의존관계 설정
@Autowired = 자동주입

@Service 어노테이션안에는 @Component 어노테이션도 들어가있음(컨트롤러,리포지토리 어노테이션도 다 컴포넌트 갖고있음)
자바 코드로 직접 스프링빈 등록하기
public class SpringConfig {
//요렇게 하면 스프링빈에 멤버서비스 객체를 등록해라~라는 명령으로 받아들여서 등록해줌
@Bean
public MemberService memberService(){
return new MemberService();
}
}
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
서비스는 항상 레포지토리를 필요로 하니까 저렇게 인자로 레포지토리를 넣어줘야함
컨트롤러는 자바코드로 딱히 하는건 없고 (컨트롤러는 필수적으로 필요하기 때문에) 그냥 원래 하던대로 컨트롤러 어노테이션달고 오토와이어드로 서비스 주입시켜주면 된다. 그럼 저위에 코드인 new MemberService(memberRepository())가 주입이 됨.
예전엔 xml로 했지만 요샌 안함. 생성자 주입을 권장함!!!!
스프링빈에 등록되어야만 반드시 오토와이어드 같은것들도 작동하는것이다.등록자체가 안돼면 아무것도 못햐요
'Develop > 곤부📙' 카테고리의 다른 글
김영한 '스프링 입문' / 5 (0) | 2023.10.05 |
---|---|
김영한 '스프링 입문' / 4 (0) | 2023.10.03 |
게시판 만들기 (0) | 2023.09.25 |
김영한 '스프링 입문' / 2 (0) | 2023.09.14 |
Vue Router (0) | 2023.09.13 |