@Override
public PostGetResponseDto findPostWithFavorite(Long postId, Member member) {
return queryFactory.select(
Projections.constructor(PostGetResponseDto.class,
post.member.id.as("memberId"),
post.member.nickname.as("author"),
post.title,
post.content,
post.category,
post.imageUrl,
post.viewCnt,
post.upCnt,
favorite.post.count().as("favoriteCnt"),
post.modifiedUpTime,
favoriteStatus(member).as("favoriteStatus")))
.from(post)
.where(isNotDeleted(), post.id.eq(postId))
.leftJoin(favorite)
.on(favorite.post.eq(post))
.join(post)
.on(post.id.eq(QMember.member.id))
.fetchOne();
}
오늘 작성한 코드다.. Dto 는 이런데
@Builder
public record PostGetResponseDto(
Long memberId,
String author,
String title,
String content,
Category category,
Map<Integer, Object> imageUrl,
Long viewCnt,
Long upCnt,
Long favoriteCnt,
LocalDateTime modifiedUpTime,
boolean favoriteStatus
) {
}
원래는
@Builder
public record PostGetResponseDto(
Long memberId,
String author,
String title,
String content,
String category, // 카테고리 name 매핑 시켜서 들어가게 했었음
Map<Integer, Object> imageUrl,
Long viewCnt,
Long upCnt,
Long favoriteCnt,
LocalDateTime modifiedUpTime,
boolean favoriteStatus
) {
}
근데!! 쿼리 최적화를 하면서 QueryDsl 을 쓰다보니 Enum의 필드값을 String category로 어떻게 받나 계속 부딪혀봄...
참고로 카테고리 enum은 이렇게 생겼다
@Getter
public enum Category {
HOME_ELECTRONICS(CategoryName.HOME_ELECTRONICS),
ELECTRONICS(CategoryName.ELECTRONICS),
FASHION_MISCELLANEOUS(CategoryName.FASHION_MISCELLANEOUS),
BEAUTY(CategoryName.BEAUTY),
INFANT_CHILDCARE(CategoryName.INFANT_CHILDCARE),
FOOD(CategoryName.FOOD),
KITCHEN(CategoryName.KITCHEN),
HOUSEHOLD(CategoryName.HOUSEHOLD),
FURNITURE_INTERIOR(CategoryName.FURNITURE_INTERIOR),
SPORT_LEISURE(CategoryName.SPORT_LEISURE),
CAR(CategoryName.CAR),
HOBBY_GAME_BOOK_ALBUM_DVD(CategoryName.HOBBY_GAME_BOOK_ALBUM_DVD),
OFFICE_SUPPLIES(CategoryName.OFFICE_SUPPLIES),
PET(CategoryName.PET),
ETC(CategoryName.ETC);
private final String name;
Category(String name) {
this.name = name;
}
public static class CategoryName {
public static final String HOME_ELECTRONICS = "가전제품";
public static final String ELECTRONICS = "전자제품";
public static final String FASHION_MISCELLANEOUS = "패션의류/잡화";
public static final String BEAUTY = "뷰티/미용";
public static final String INFANT_CHILDCARE = "출산/유아동";
public static final String FOOD = "식품";
public static final String KITCHEN = "주방용품";
public static final String HOUSEHOLD = "생활용품";
public static final String FURNITURE_INTERIOR = "가구/인테리어";
public static final String SPORT_LEISURE = "스포츠/레저";
public static final String CAR = "자동차용품";
public static final String HOBBY_GAME_BOOK_ALBUM_DVD = "취미/게임/도서/음반/DVD";
public static final String OFFICE_SUPPLIES = "문구/오피스";
public static final String PET = "반려동물용품";
public static final String ETC = "기타중고물품";
}
}
저 name 만 딱 가져오고 싶은데!!!!!!! 해서
public static String getNameByEnumName(String enumName) {
return Arrays.stream(Category.values())
.filter(e -> e.name().equals(enumName))
.findFirst()
.map(Category::getName)
.orElse(null);
}
enum 클래스 안에 이런 정적 메서드를 짜봤는데
애초에 QueryDsl 에서 Q클래스 안에 Enum을 EnumPath로 만들어서 stringValue()...toString().... 뭐 getType().getName().... 이런 거를 다해봐도 안된다. 안 됨!!!!!!! 몇시간동안 할 수 있는 거 다 해봤다.
내가 모르는 걸일 수도...
검색해서 찾아보니 컨버터가 있어서 그걸 쓰면 될 거같다는 게 있었는데 그것도 안됨!!!!!!!!
그냥 간단하게... Dto에서 enum 받고 타임리프에서 따로 category.getName 으로 해결했다.. 뭔가 방법이 있을 거 같아서 계속 찾아봤었는데.. 전부 안돼서 짜증.................
'TIL' 카테고리의 다른 글
TIL 2024-01-22 타임리프 작성자가 아닐 시 버튼 안보이게 하기 (0) | 2024.01.22 |
---|---|
TIL 2024-01-19 CORS 란? (0) | 2024.01.20 |
TIL 2024-01-16 커서 기반 페이지네이션 구현 (0) | 2024.01.16 |
TIL 2024-01-15 프록시 서버 (0) | 2024.01.16 |
TIL 2024-01-12 TransactionlEventListener 와 비동기 메서드 (0) | 2024.01.12 |