Day42

강태훈·2026년 3월 3일

nbcamp TIL

목록 보기
42/58

코드카타

조건에 맞는 사용자와 총 거래금액 조회하기

SELECT U.USER_ID, U.NICKNAME, SUM(B.PRICE) AS TOTAL_SALES
FROM USED_GOODS_USER U
JOIN USED_GOODS_BOARD B
ON U.USER_ID = B.WRITER_ID
WHERE B.STATUS LIKE 'DONE'
GROUP BY U.USER_ID
HAVING SUM(B.PRICE) >= 700000
ORDER BY 3 ASC
;

3월에 태어난 여성 회원 목록 출력하기

SELECT MEMBER_ID, MEMBER_NAME, GENDER, 
       DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = 3
AND GENDER LIKE 'W'
AND TLNO IS NOT NULL
ORDER BY MEMBER_ID ASC
;

대여 기록이 존재하는 자동차 리스트 구하기

SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR C 
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
ON C.CAR_ID = H.CAR_ID
WHERE C.CAR_TYPE LIKE '세단'
AND MONTH(H.START_DATE) = 10
ORDER BY C.CAR_ID DESC
;

즐겨찾기가 가장 많은 식당 정보 출력하기

SELECT R.FOOD_TYPE, R.REST_ID, R.REST_NAME, R.FAVORITES
FROM REST_INFO R
JOIN (
    SELECT FOOD_TYPE, MAX(FAVORITES) AS MAX_FAV
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) M
ON R.FOOD_TYPE = M.FOOD_TYPE
AND R.FAVORITES = M.MAX_FAV
ORDER BY R.FOOD_TYPE DESC
;

식품분류별 가장 비싼 식품의 정보 조회하기

SELECT F.CATEGORY, F.PRICE AS MAX_PRICE, F.PRODUCT_NAME 
FROM FOOD_PRODUCT F
JOIN (
    SELECT CATEGORY, MAX(PRICE) AS MAX_P
    FROM FOOD_PRODUCT
    GROUP BY CATEGORY
) M
ON F.CATEGORY = M.CATEGORY
AND F.PRICE = M.MAX_P
WHERE F.CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY F.PRICE DESC
;

5월 식품들의 총매출 조회하기

SELECT P.PRODUCT_ID, P.PRODUCT_NAME, (P.PRICE * O.TOTAL_AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT P
JOIN (
    SELECT PRODUCT_ID, SUM(AMOUNT) AS TOTAL_AMOUNT
    FROM FOOD_ORDER 
    WHERE YEAR(PRODUCE_DATE) = 2022
    AND MONTH(PRODUCE_DATE) = 5
    GROUP BY PRODUCT_ID
    -- AND OUT_DATE IS NOT NULL
) O
ON P.PRODUCT_ID = O.PRODUCT_ID
ORDER BY 3 DESC, 1 ASC
;

과제 진행

@Pattern 사용법

@Pattern(regexp = "^[0-9]$", message = "숫자만 입력할 수 있습니다.")
@Pattern(regexp = "^[a-zA-Z]*$", message = "영어 알파벳만 입력할 수 있습니다.")
@Pattern(regexp = "^[a-zA-Z0-9]*$", message = "영어 알파벳과 숫자만 입력할 수 있습니다.")
@Pattern(regexp = "^[가-힣]*$", message = "한글만 입력할 수 있습니다.")
@Pattern(regexp = "^[\\w!#$%&'*+/=?`{|}~^.-]+@[\\w.-]+\\.[a-zA-Z]{2,6}$", message = "이메일 형식이 올바르지 않습니다.")
@Pattern(regexp = "^\\d{2,3}-\\d{3,4}-\\d{4}$", message = "전화번호 형식이 올바르지 않습니다.")
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&#])[A-Za-z\\d@$!%*?&#]{8,}$", message = "비밀번호 형식이 올바르지 않습니다. 8자 이상, 대소문자 포함, 숫자 및 특수문자(@$!%*?&#) 포함")
@Pattern(regexp = "^A.*", message = "'A'로 시작해야 합니다.")
@Pattern(regexp = ".*A$", message = "'A'로 끝나야 합니다.")
@Pattern(regexp = ".*ABC.*", message = "'ABC' 문자열을 포함해야 합니다.")
@Pattern(regexp = "^(?!.*ABC).*$", message = "'ABC' 문자열을 포함하면 안됩니다.")
@Pattern(regexp = "^A.*A$", message = "'A'로 시작하고 'A'로 끝나야 합니다.")
@Pattern(regexp = "^(?=.*ABC)(?!.*DEF).*$", message = "'ABC' 문자열을 포함하고 'DEF' 문자열을 포함하면 안됩니다.")

N+1해결

@Query("select o from Order o join fetch o.user")
	or
@EntityGraph(attributePaths = {"user"})
항목Fetch Join@EntityGraph
사용 위치JPQLRepository 메서드
코드 길이길다짧다
복잡한 조건가능제한적
동적 쿼리가능어려움
가독성낮을 수 있음좋음

포스트맨 500번 서버 에러 발생

[expert] [nio-8080-exec-4] org.example.expert.config.JwtFilter : 예상치 못한 오류: URI=/users
  • 해당 오류 메세지
log.info("userId attribute = {}", httpRequest.getAttribute("userId"));
log.info("claims subject = {}", claims.getSubject());
INFO 11484 --- [expert] [nio-8080-exec-6] org.example.expert.config.JwtFilter : userId attribute = 1 
INFO 11484 --- [expert] [nio-8080-exec-6] org.example.expert.config.JwtFilter : claims subject = 1 
ERROR 11484 --- [expert] [nio-8080-exec-6] org.example.expert.config.JwtFilter : 예상치 못한 오류: URI=/users
  • jwtFilter가 정상 작동하는지 로그로 확인
    -> 정상 작동함
    -> WebMvcConfig확인
    -> WebMvcConfig에서 Resolver가 등록되지않은것을 확인
@Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(authUserArgumentResolver);
    }
}
  • 코드 추가
    -> 해결

관리자 권한 기능 에러

  • ADMIN권한으로 접근해도 권한 없음 에러 발생
    -> JwtFilterAdminInterceptorsession으로 설정해둔 것을 발견...(왜그랬지?)
    -> 수정 완료

LV 6. 맘대로 추가 수정


  1. [문제 인식 및 정의]
    comment엔티티와 todo엔티티에 update메서드가 있지만 사용되고 있지않던 것을 발견

  2. [해결 방안]
    메서드 삭제와 기능 추가 중에서 고민하다가 기존에 일정 관리 프로젝트 때 많이 했던 내용이기 때문에 기능 추가로 결정

  3. [해결 완료]
    update기능 추가 완료


  1. [문제 인식 및 정의]
    UserSaveResponse dto가 사용되고 있지않던 것을 발견

  2. [해결 방안]
    토큰을 응답하는 dto이지만 이미 로그인과 회원가입에 응답 dto가 있기때문에 필요없다고 판단

  3. [해결 완료]
    삭제 완료

0개의 댓글