SpringPlus- 개인과제(3)

ChoRong0824·2025년 3월 13일
0

Web

목록 보기
39/51

요구 사항들을 정리하면,

  1. 할 일 검색 시 weather 조건 추가
    • weather 값이 있을 경우, 해당 값으로 필터링
    • weather 값이 없을 경우, 필터링 없이 전체 조회
  2. 할 일 검색 시 수정일(modifiedAt) 기준으로 기간 검색 추가
  • 시작일(startDate)와 종료일(endDate)을 필터링 조건으로 사용
  • 둘 다 없으면 필터링 없이 전체 조회
  1. JPQL
  • 동적 쿼리를 작성해야 하므로 @Query활용 하면 됨
    -> 대신, 너무 긴 메서드명만 지양하면 된다.

즉,
전체적인 로직에서 보면 repository엔 jpql 기반 검색 메서드 추가해주고, service엔 if문을 활용해서 여러 개의 jpql을 사용할 수 있게하고, Contoroller에서 새로운 검색 api를 추가하면 되는 것이다.


일단 해당 개념을 알아야 수정이 가능하지 않습니까!? ㅎㅎ
그래서 준비했습니다.

최단 기간에 효과적으로 학습하는 방법

1. 개념 정리 (필수 이론)

Spring Boot JPA 핵심 개념

엔티티 매핑 (@Entity, @Id, @GeneratedValue)
연관관계 (@OneToMany, @ManyToOne, @JoinColumn)
FetchType.LAZY와 Fetch Join 활용
JPQL & QueryDSL 개념

Spring Data JPA 활용

@Query 사용법 → JPQL 작성법
동적 쿼리 (Criteria API, QueryDSL)
페이징 (Pageable, Page<T> 활용)

Spring Boot REST API 개발

@RestController, @RequestParam, @RequestBody, @PathVariable
ResponseEntity 활용 (에러 처리 포함)

JWT 기반 인증 & 보안

JWT 개념 (Claims, Header, Payload)
토큰 발급 및 검증 (JwtUtil, Filter 활용)
Security 적용 (UserDetails, Authentication)


2. 추천 공부 자료 (최단 학습)

온라인 문서 & 공식 가이드

  1. 📖 Spring Data JPA 공식 문서
    → JPA + Spring Boot 활용법 (JPQL, QueryDSL 등)
  2. 📖 Baeldung - JPA Query Guide
    → JPQL과 Criteria API, QueryDSL 예제 코드
  3. 📖 JWT 공식 문서 (io.jsonwebtoken)
    → JWT 생성 및 파싱 예제

3. 실전 연습(주먹구구)

실습 1) Todo 검색 기능 개발
weather, 기간 검색 동적 쿼리 연습
JPQL, @Query 활용
페이징 API 추가 (Page<T> 활용)

연습 코드

@Query("SELECT t FROM Todo t " +
       "WHERE (:weather IS NULL OR t.weather = :weather) " +
       "AND (:startDate IS NULL OR t.modifiedAt >= :startDate) " +
       "AND (:endDate IS NULL OR t.modifiedAt <= :endDate)")
Page<Todo> searchTodos(@Param("weather") String weather,
                       @Param("startDate") LocalDateTime startDate,
                       @Param("endDate") LocalDateTime endDate,
                       Pageable pageable);

실습 2) JWT에 nickname 추가 후 검증
JWT 토큰 생성 시 nickname 추가
JwtFilter에서 nickname 검증 후 request.setAttribute 활용

// JWT 생성 (nickname 추가)
public String createToken(Long userId, String email, String nickname, UserRole userRole) {
    return Jwts.builder()
        .setSubject(String.valueOf(userId))
        .claim("email", email)
        .claim("nickname", nickname) // 닉네임 추가
        .claim("userRole", userRole)
        .signWith(key, signatureAlgorithm)
        .compact();
}

// JWT 필터에서 닉네임 검증
String nickname = claims.get("nickname", String.class);
if (nickname == null) {
    httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "jwt에 닉네임 정보가 없습니다.");
}

실습 3) Lazy Loading과 Fetch Join 차이 비교
@ManyToOne(fetch = FetchType.LAZY) 와 Fetch Join 차이점 실습
N+1 문제 해결 방법 이해

// Lazy Loading (N+1 발생 가능)
@Query("SELECT t FROM Todo t WHERE t.user.id = :userId")
List<Todo> findTodosByUserId(@Param("userId") Long userId);

// Fetch Join (N+1 해결)
@Query("SELECT t FROM Todo t JOIN FETCH t.user WHERE t.user.id = :userId")
List<Todo> findTodosWithUser(@Param("userId") Long userId);

제가 만약에 해당 내용을 제대로 모른 상태에서 7일이 주어졌다면, 아래와 같이 공부할 것 같습니다.


추천할만한 퐈스팅

1. Spring Boot와 JPA 관련 자료


2. Spring Security와 JWT 관련 자료

  • Spring Security + JWT 적용하기
    Spring Security와 JWT를 활용하여 인증과 인가를 구현하는 방법을 단계별로 설명합니다. JWT의 개념부터 토큰 발급 및 검증, Spring Security와의 연동 등을 다룹니다.
    https://seungh1024.tistory.com/62#google_vignette
  • Spring Security + JWT를 이용한 토큰 발급 및 회원가입, 로그인 로직 구현
    Spring Boot, Spring Security, JWT를 이용하여 토큰 발급 및 회원가입, 로그인 로직을 구현하는 방법을 상세하게 설명합니다.

3. 기타 유용한 자료

  • Spring Boot에서 JWT를 활용한 인증 구현
    Spring Boot에서 JWT를 활용하여 인증을 구현하는 방법을 설명합니다. JWT는 상태를 유지하지 않는 인증 방식으로, RESTful 시스템에서 효율적인 보안 모델을 제공합니다.
    https://epicarts.tistory.com/167
  • [Spring] 실전! 스프링 부트와 JPA 활용 #application.yml
    '실전! 스프링 부트와 JPA 활용' 학습 후 정리한 자료로, application.yml 설정에 대한 내용을 다룹니다.

',', <join>, FETCH, GROUP, HAVING, ORDER or WHERE expected, got '('

?? 잘 작성한 것 같은데 뭐가 문제지 ? 또르르르르르륵 검색~~~
문법적 오류 때문입니다.
조건문을 작성할 때, 공백이 없거나, WHERE 바로 뒤에 괄호가 있는 경우 JPQL 문법 오류가 발생할 수 있습니다.

참고로 컨트롤러는

튜터님의 작성 코드를 토대로 추가해서 구현해봤습니다.

profile
백엔드를 지향하며, 컴퓨터공학과를 졸업한 취준생입니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글