스프링 공부 77

[스프링] 31. MemberController-회원가입 기능 구현하기, Null/Success 테스트

이제 컨트롤러를 좀 만들어보며, 테스트도 해보려고 한다. 일단 제일 간단한 회원가입 로직부터 만들고, 테스트를 해봐야겠다. @RestController @RequiredArgsConstructor public class MemberController { private final MemberService memberService; @PostMapping("/join") public String register(@RequestBody @Valid RegisterRequestDto registerRequestDto){ memberService.registerNewMember(registerRequestDto); return "success register"; } } 간단하게 만들었다. 일단, RegisterR..

[스프링] 30. MemberRepositoryTest_Search_Contains에서 검색조건이 서로 다른 객체를 향하는 거라면 잘될까

제목에서 보는 그대로의 목표를 위해 테스트코드로 검증을 해보려고 한다. 일단, and를 이용했을 경우, 검색하는 값이 testUser1을 목표로 하는 파라미터와, testUser2를 목표로 하는 파라미터라면, 검색시에 아무것도 나오지 않는다. 하지만, or과 contains를 입력하면 SearchMemberDto에 username = "11", nickname = null, email = "22"로 검색하면 11, 22번의 두 멤버가 나와야 한다. 이게 잘 이루어지는지 확인해보고 싶었다. @Test @DisplayName("") public void 서로_다른_객체를_요구하며_검색하기() throws Exception{ //given SearchMemberDto searchMemberDto = new S..

[스프링] 29. MemberRepository.search를 최적화시켜보자!!

저번의 생각을 토대로, 조금 더 최적화를 해보려고 했다. 일단 처음의 코드를 보자면, private BooleanExpression usernameEq(String username, SearchType searchType){ if(username == null || username.isEmpty() || username.isBlank()) return null; if(searchType.equals(CONTAINS)) return member.username.contains(username); return member.username.eq(username); } private BooleanExpression nicknameEq(String nickname, SearchType searchType){ if..

[스프링] 28. MemberService까지 만들고의 회고, 그리고 search를 마지막까지 다듬어보자!!

일단 MemberService를 다시 돌아보았다. validate / domain logic / repository사용을 최대한 분리해 각 메서드를 register에서 7줄 정도를 만든게 최대 길이일 정도로 최대한 잘게 나누어 사용해보았다. 이렇게 되면서, 메서드 재사용성을 확인하고, 각 로직에서 에러가 발생했을 때, 어떤 이유인지 확인하기 용이했던 장점이 있다. 또한, 로그인 로직에서 Token까지 MemberService로 묶었을 때 하나의 서비스까지 두개의 도메인을 따로 가져와 다 사용한다는게 조심스러웠는데, 이 부분을 나누는데 시간을 많이 쓴 것 같다. 원래 도메인 로직밖에 테스트할 줄 몰랐는데, 이번에 리포지토리, 서비스 테스트에 대해서 연습해보고 적용해볼 수 있어 더 좋았다. 개인적으로 컨트롤..

[스프링] 27. MemberService.search의 기능을 조금 더 다양하게 만들어보기(페이징, like이용)

private static final PageRequest page = PageRequest.of(0, 3); search 하나로 더욱 다양한 기능을 만들 방법을 생각해보았다. 페이징을 추가하자 RequestParam방식으로 페이지를 입력받아 몇 번째 페이지인지를 알려줄 것이다. 한 페이지당 기본으로 10개정도의 결과를 가지게 반환시킬 계획이다. 멤버 조회시 아이디, 닉네임, 이메일이 나오므로 총 30줄정도가 나올 것 이므로 10개 정도가 적당하다는 생각이 들었다. contains를 동적으로 추가하자 enum클래스를 만들어 RequestParam으로 검색방식을 정확한 검색인지, 혹은 검색하는 문구가 포함된 값을 구하는지를 정하게 할 것이다. 이전에 만들었던 ~~Eq메서드에 enum타입의 값을 받아 만약 ..

[스프링] 26. MemberService : 로그인 로직 만들기

이번 프로젝트에서 jwt토큰을 이용해 로그인을 하게 하려고 했다. 이를 위해서 두가지 과정이 필요하다 로그인 요청을 이용해 Authentication을 만든다. 로그인 요청을 validate한다 요청의 아이디와 비밀번호를 가지고 UsernamePasswordAuthenticationToken을 만들어준다. 토큰에서 authentication을 뽑아온다. Authentication을 가지고 토큰을 만들고, 토큰 응답을 반환한다. TokenProdivder에서 Authentication을 가지고 TokenDto를 생성해준다. authentication에서 name(아이디)를 key, TokenDto의 refreshToken을 value로 가지는 RefreshToken객체를 만들어 저장한다. 이를 TokenR..

[스프링] 25. 조회에 대한 서비스 로직 만들어 테스트하기...?

사실 검색에 대한 테스트코드를 만드는 것은 간단하다. 리포지토리 테스트코드에서, 기능들을 그대로 가져다 쓰는 것과 동일하다 . @BeforeEach void createData() { for(int index = 0; index < 10; index++){ RegisterRequestDto registerRequestDto = RegisterRequestDto.builder() .username("testUser" + index) .nickname("test" + index) .email("test" + index + "@test.com") .password("password" + index) .passwordCheck("password" + index) .build(); memberService.reg..

[스프링] 24. Member 데이터 변경을 비즈니스 로직에 추가하기

일단 정보 수정을 수행하는 로직의 테스트부터 만들어볼 것이다. 닉네임 수정 닉네임 중복으로 예외처리 정상적으로 수정 이메일 수정 이메일 중복으로 예외처리 정상적으로 수정 비밀번호 수정 기존 비밀번호와 동일해 예외처리 입력한 비밀번호 2가지가 서로 불일치 정상적으로 수정 이렇게 총 3가지의 수정 메서드와, 각 메서드당 2(비밀번호는 3)가지 경우가 생기게 된다. 결국 7가지 테스트를 만들어두고, 이에 대해 기능을 수행하는 메서드를 만들어보려고 한다. private Member makeMember(String index){ RegisterRequestDto registerRequestDto = RegisterRequestDto.builder() .username("test" + index) .nickname..

[스프링] 23. MemberService의 registerNewMember를 만들어보자!

이전에 만든 테스트가 동작하게, 하나씩 만들어보아야 겠다. 일단, 아이디 중복을 처리했을 때 동작하는지 코드를 만들어보자. private void validateUsername(String username){ if(memberRepository.findByUsername(username).isPresent()) throw new UsernameAlreadyInUseException(); } 이런식으로 중복이 되는 것을 닉네임, 이메일에도 처리해주었다. validateUsername(registerRequestDto.getUsername()); validateNickname(registerRequestDto.getNickname()); validateEmail(registerRequestDto.getEma..

[스프링] 22. MemberService의 테스트 : 회원가입 만들기

이제 리포지토리에서 구현했던 기능들과, Member 도메인 로직을 이용해, 멤버의 서비스를 구현할 것이다. 도메인 로직과 리포지토리의 기능들을 이용해, 실제 멤버가 동작해야 할 비즈니스 로직을 만들어볼 것이다. 구조를 생각해보기 위해 회원가입을 생각해보자. 입력을 받는다. 중복 계정을 조회한다. 중복 닉네임을 조회한다. 중복 이메일을 조회한다. 비밀번호를 2번 입력받았을 때 이를 확인한다. 비밀번호를 암호화 시켜준다. 입력으로 Member를 생성해준다. MemberRepository.save해준다. 이런 방식으로 이루어진다. 그렇다면, 회원가입을 했을 때 문제가 생길 결과는 무엇일까? 입력값이 다른 회원과 중복될 때, 예외처리된다(아이디, 닉네임, 이메일 예외를 모두 따로 설정해준다) 비밀번호 입력이 서..