전체 글
-
달력 범위 관련 검증하는 커스텀 어노테이션 만들기인턴 2025. 8. 5. 11:26
유저리스트를 불러오는 과정에서 사용자 등록일을 지정하는 부분에서 피드백을 받았다. 범위를 시작하는 날짜가 종료하는 날짜보다 더 미래일 경우에 대한 부분이다. 예를 들어 시작일 : 2025년 8월 1일종료일 : 2025년 7월 1일 이런 식이면 사실 말이 안되는 말이긴 하다. 보통 날짜를 정하는 범위에서 시작일이 종료일보다 과거여야 하기 때문이다. 그래서 오늘은 이 부분을 개발하면서 만든 코딩부분을 블로깅을 하려고 한다. 내가 개발하면서 신경을 쓴 부분은 바로 코드의 재활용성이다.이 코드가 예를 들어 유저 리스트를 조회하는 부분에서 사용될 수도 있지만, 게시글을 조회할 때도 사용될 수 있기 때문이다. 1. 커스텀 annotation 구현@Constraint(validatedBy = DateRangeVali..
-
[dhtmlx] Grid + Pagination 적용시 Grid에 데이터가 보이지 않을 때트러블슈팅 2025. 8. 4. 14:38
회사에서 dhtmlx라는 라이브러리를 사용하고 있었다. (진짜진짜 처음 들어보긴 했다..) 어찌저찌 적응하며 개발하고 있었는데 사용자 리스트 정보를 받아오던 중 페이징을 하려고 하니 뭐가 자꾸 안된다...... dhtmlx에서 나와있는 페이징 방식은 원래 모든 데이터를 불러와서 dhtmlx의 Pagination이 알아서 페이징 처리를 해준다. 하지만 이 방법은 너무 과부하가 걸리는 방법 같았기에 내가 백엔드에서 기존에 했던 방식인 Pageable을 사용해서 페이징을 하는 것이다. 근데 이렇게 하다보니 자꾸 오류가 생겼는데,,,, 그것은 바로 1페이지에서만 사용자 정보를 Grid에 잘 불러오는데그 이외의 페이지는 Grid에 표시 자체가 되지 않았다.(각 페이지별 백엔드로 요청한 것에 대한 응답은 잘 넘어옴..
-
JPA에서 @NoArgsConstructor(access = AccessLevel.PROTECTED) 사용하는 이유와 속성인턴 2025. 7. 28. 18:03
사실 JPA 검색해보면 entity 위에 @NoArgsConstructor(access = AccessLevel.PROTECTED)를 붙이라고 하는데 이유 없이 붙이고 코드리뷰를 받았다가 바로 지적당했다.. 이 참에 왜 저것을 사용해야 하는지 알아보자. 1. JPA에서 @NoArgsConstructor(access = AccessLevel.PROTECTED)의 의미와 이유1)JPA가 Entity 객체를 어떻게 생성할까?JPA는 DB에서 데이터를 읽어서 Entity 객체를 만들 때 리플렉션(Reflection)을 사용해서 인스턴스를 생성한다.이때, 기본 생성자가 필요하다 → 없으면 런타임에서 에러 발생** 리플렉션이란?자바 코드가 런타임에 클래스, 메서드, 필드 등을 동적으로 조회하고, 조작할 수 있게 해..
-
[QueryDSL]BooleanBuilder where 조건 그리고 Predicate 에 대해서..인턴 2025. 7. 23. 14:19
querydsl 사용중, 동적 쿼리를 작성할 때 BooleanBuilder를 사용하면 매우 좋다는 건 알겠다.private Predicate idEq(String id) { return (id == null || id.isBlank()) ? null : QUser.user.id.eq(id);}private Predicate nameEq(String name) { return (name == null || name.isBlank()) ? null : QUser.user.name.eq(name);}private Predicate levelEq(String level) { return (level == null || level.isBlank()) ? null : QUser.user.level...
-
@QueryProjection그때그때궁금한 2025. 7. 22. 13:11
QueryDSL을 사용하던 도중, 순서가 바뀌어 출력되는 경우가 있었다. 프론트쪽에서 콘솔을 찍어보니 이름이 들어갈 곳에 id가..아이디가 들어가야 할 쪽에 이름이..? 찾다보니 DTO를 이용해서 타입을 지켜주기 위해 사용했었는데, 거기 생성자에 들어간 순서대로 데이터가 담기는거라, 순서가 바뀐 것이었다. 자세히 공부하지 않고 적용하면서 친해졌지만, 자세히 알아보자. 1. @QueryProjection 이란?QueryDSL을 사용한 동적 쿼리 작성 시 DTO에 타입 안전한 방식으로 값을 매핑할 수 있도록 도와주는 기능.QueryDSL은 Java에서 SQL과 같은 타입 안전하게 작성해줄 수 있는 라이브러리로, 주로 Spring Data JPA와 함께 사용되며, 복잡한 동적 쿼리를 작성할 때 유용하다.2. ..
-
QueryDSL에 사용되는 객체들은 뭐가 있을까?인턴 2025. 7. 22. 10:46
이번 과제 중 조건에 따른 유저리스트를 불러오는 로직에서 어떻게 해볼까 생각 중 QueryDSL이란 걸 알게되어 사용해 보았다.하지만 아직 너무 생소해서 여기서 사용되는 객체에 대해 공부해 보자. 1. Q타입(QClass, Q도메인 클래스) 1) Q타입이란?QueryDSL이 컴파일 시점에 각 엔티티를 바탕으로 자동 생성하는 클래스이름이 Q+entity명 // ex) User →QUserentity의 각 필드가 Q타입의 public final 필드로 정의됨타입이 명확히 보장돼서 오타/타입 실수 시 컴파일 에러로 잡아줌 2) 생성 예시@Entitypublic class User { @Id private String id; private String name; private Strin..
-
session에서의 getId()와 getAttribute()의 차이트러블슈팅 2025. 7. 14. 17:11
1. getId()개념세션 자체의 고유 식별자를 반환하는 메서드세션이 생성될 때마다 서버가 임의의(보통 긴 문자열) 값을 부여함역할/용도이 값은 클라이언트(브라우저)에 세션 쿠키로 전달되고, 다음 요청부터 "나 이 세션이야 !"라고 서버에 알려줌주로 세션이 제대로 관리되는지 확인할 때, 혹은 세션 고정 공격 방지등에서 "세션 식별값"이 바뀌는 지 확인할 때 사용예시HttpSession session = request.getSession();String sessionId = session.getId();System.out.println(sessionId); // 예: "B39F3E7A81236E3E09A9D87B7FC6F5A8"2. getAttribute(String name)개념세션에 저장된 "값(데이터..
-
async / await 이란??인턴 2025. 7. 14. 11:36
js에서 비동기 처리를 위해 있는 문법중 하나인 async / await 에 대해 알아보자. async/await - 자바스크립트에서 비동기 코드를 마치 동기 코드처럼 작성하고 읽을 수 있도록 해주는 문법이다. promise 로직을 더 쉽고 간결하게 사용할 수 있게 해주는 건데, 여기서 유의해야 할 점이 async/await 이 *promise를 대체하기 위한 기능이 아니라는 것이다. 내부적으로는 여전히 promise를 사용해서 비동기를 처리하고, 단지 코드 작성 부분을 개발자가 유지보수하기 편하게 보이는 것 뿐이다. **promise란? - 비동기 작업을 처리하기 위한 객체이다. promise는 비동기 작업의 성공 또는 실패를 나타내며, 이를 통해 콜백 함수를 사용했을 때 발생하는 콜백 지옥 문제를 해..