[15] Spring - JPA-Plus 과제 필수레벨_1
📁️ 과제 요구사항)
[레벨1]
1-1) 코드 개선 퀴즈 - @Transactional의 이해
- 할일 저장 기능 api controller에서 해당 에러가 발생하고있다.
- 해당 에러가 발생하지 않고 정상적으로 기능이 동작하도록 코드를 수정해주세요.
1-2) 코드 추가 퀴즈 - JWT의 이해
- User의 정보에 nickname을 JWT에서 추가해주세요.
- User의 닉네임을 프론트엔드단에서 필요하다고 합니다.
1-3) 코드 개선 퀴즈 - AOP의 이해
- UserAdminController 클래스의 changeUserRole()메소드가 실행 전 동작해야합니다.
- AdminAccessLoggingAspect 클래스에 있는 AOP가 개발 의도에 맞도록 코드를 수정해주세요.
1-4) 테스트 코드 퀴즈 - 컨트롤러 테스트의 이해
- 테스트가 정상적으로 수행될 수 있도록 테스트 코드를 수정해주세요.(현재는 테스트가 실패하고 있습니다.)
1-5) 코드 개선 퀴즈 - JPA의 이해
- 할일 검색 controller에서 weather 조건으로 검색할 수 있도록 추가
- weather는 조건이 있을 수도 있고, 없을 수도 있다.
- 동일하게 수정일도 추가하여 기간 검색할 수 있도록 추가
- 기간의 시작과 끝 조건은 있을 수도 있고, 없을 수도 있다.
- JPQL을 사용해주세요.(필요할 시 서비스단에서 IF문을 여러개 사용해도 됩니다.)
🛠️ 과제 해결 및 코드)
1-1) 코드 개선 퀴즈 - @Transactional의 이해
※ 제목을 보면 @Transactional 어노테이션의 대한 이해라고 되어있다. @Transactional 어노테이션을 집중적으로 살펴볼 필요가 있다.
- 문제에서 Controller에서 에러가 발생하고 있다고 하였지만, @Transactional 어노테이션을 사용하고 있는 service단을 확인했다.
- @Transactional(readOnly=true) 설정으로 인해서 등록할때 에러가 발생하고 있었다. 주석처리하여 해결하였다.
1-2) 코드 추가 퀴즈 - JWT의 이해
- 요구사항대로 nickname을 추가해야하기 때문에 JwtUtil에서 토큰생성하는 메서드에서 정보를 담아주면된다.
- 추가로 유저테이블에 닉네임컬럼추가, User entity에 필드추가, 생성자에 닉네임추가, common AuthUser에 필드 및 생성자 추가, 회원가입 request시 닉네임추가, JwtUtil 및 JwtFilter 추가, AuthUserArgumentResolver에 추가
- 할일, 댓글, 담당자 등록 등 모든 user객체로 정보 호출시 닉네임 추가
- 등의 작업을 진행했으나 코드가 너무 많기 때문에 JwtUtil 코드만 글에 작성하겠다.
※ 모든 관련된 작업에 대해서 닉네임을 다 추가하고 User객체를 출력시 nickname을 같이 나오게끔 하기 위해서 관련된 코드를 전체 수정했다.
1-3) 코드 개선 퀴즈 - AOP의 이해
- 기존 코드를 주석 처리하고, 요구사항에 맞는 경로로 @After수정
1-4) 테스트 코드 퀴즈 - 컨트롤러 테스트의 이해
- 테스트코드가 자체가 예외를 발생하도록 하는 코드인데 주석되어 있는 기존코드를 확인하면 상태코드부터해서 성공코드를 출력하고 있다.
- 아래처럼 에러메시지를 출력하는 형태로 바꾸고 BAD_REQUEST로 변경하여 처리한다.
- 위와 같이 변경하여 정상적으로 테스트코드 실행되는 것을 확인할 수 있다.
1-5) 코드 개선 퀴즈 - JPA의 이해
- 요구사항에 맞게, 날씨와 수정일 시작,종료일 3개의 값을 받기 위해 @RequestParam으로 3개를 추가한다.
- required=false 설정으로 null값도 받을수있게 설정?(값이 있을수도 없을수도 있다라는 요구사항을 지키기위함)
- 날씨 검색과 날짜검색 그리고 마지막으로 날씨&날짜 동시검색을 위하여 JPQL을 3개 작성한다.
- 쿼리문을 String으로 따로 초기화하는 이유는 혹시나 저 쿼리를 전체 쿼리로 활용할 수 있기 때문에 저렇게 처리를 했으나, 현재는 각각의 쿼리를 사용하고 전체쿼리도 따로 사용하는 형태로 되어있어서 문제는 없다.
- Repository에서 각각만든 JPQL을 각각의 조건문에 따라 Todo 객체에 담아준다.
- 주석으로 각각의 조건에 대해서 설명을 해두었다.
- 가장 위에는 검색을 아무것도 안할 경우에 기존 쿼리를 실행하는 쿼리메소드이다.
- 날씨만 검색했을때 조회되는 쿼리문 where절이다.
- LIKE문으로 처리했다.
- 날짜만 검색했을때 조회되는 쿼리문 where절이다.
- 날짜의 형식을 DATE_FORMAT()으로 맞추고 BETWEEN을 사용해서 시작,종료일 범위를 검색한다.
- 날씨와 날짜를 동시에 검색하는 경우이다.
- 위에서 사용한 LIKE문과 DATE_FORMAT() BETWEEN이 다 조회되는 것을 확인할 수 있다.
📗 간단 회고)
: 일단 1-4까지는 매우 간단한 문제였기 때문에 시간도 거의 소요되지 않고 수월하게 해결이 되었다.
그나마 1-5가 JPQL을 여러개 사용하고, 생각할 사항이 많아서 비교적 시간이 좀 더 소요되었다. 하지만 Spring을 첫 시작할때 JDBC를 연동하여 쿼리문을 다룰때 페이징,담당자&날짜&내용의 검색등을 처리하면서 더 복잡한 쿼리를 사용했어서 이번에 직접 구성한 쿼리들은 단순한 축에 속하여 금방 해결하였다. 그리고 각각의 경우의 수와 검색값의 존재유무에 따라 검색이 컨트롤 되도록 구현하여서 if문을 여러개 사용하여 처리하였다. 예전에 복잡한 쿼리를 다루던 경험이 많았어서 다행히 수월했던 것 같다. 추가적으로 JPQL은 첫 JPA과제때 이미 사용을 했었기 때문에 역시나 수월했다.