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
;
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
;
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' 문자열을 포함하면 안됩니다.")
@Query("select o from Order o join fetch o.user")
or
@EntityGraph(attributePaths = {"user"})
| 항목 | Fetch Join | @EntityGraph |
|---|---|---|
| 사용 위치 | JPQL | Repository 메서드 |
| 코드 길이 | 길다 | 짧다 |
| 복잡한 조건 | 가능 | 제한적 |
| 동적 쿼리 | 가능 | 어려움 |
| 가독성 | 낮을 수 있음 | 좋음 |
[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권한으로 접근해도 권한 없음 에러 발생JwtFilter와 AdminInterceptor에 session으로 설정해둔 것을 발견...(왜그랬지?)[문제 인식 및 정의]
comment엔티티와 todo엔티티에 update메서드가 있지만 사용되고 있지않던 것을 발견
[해결 방안]
메서드 삭제와 기능 추가 중에서 고민하다가 기존에 일정 관리 프로젝트 때 많이 했던 내용이기 때문에 기능 추가로 결정
[해결 완료]
update기능 추가 완료
[문제 인식 및 정의]
UserSaveResponse dto가 사용되고 있지않던 것을 발견
[해결 방안]
토큰을 응답하는 dto이지만 이미 로그인과 회원가입에 응답 dto가 있기때문에 필요없다고 판단
[해결 완료]
삭제 완료