프로젝트/아카이뷰
-
[Spring boot] BooleanBuilder / BooleanExpression프로젝트/아카이뷰 2024. 1. 24. 09:00
BooleanBuilder / BooleanExpression 왜 궁금했을까❓ArchiVIEW 프로젝트에서 Query DSL을 사용해 동적 쿼리를 작성하는 상황이었다. 이때, 사용되는 함수가 BooleanBuilder나 BooleanExpression을 쓰는데 차이점을 알아보고 프로젝트에 맞는 함수를 사용해보려고 한다. BooleanBuilder와 BooleanExpression의 차이점BooleanBuilder와 BooleanExpression은 동적 쿼리를 처리하는 함수로 둘 사이에 성능차이는 없으며 개발자 스타일에 맞게 사용하면 되는 것 같다.BooleanBuilder는 주로 if문으로 조건을 비교하고 BooleanBuilder에 조건을 더한다.BooleanExpression은 일반적으로 단일 조건..
-
[Spring boot] Query DSL 동적 쿼리프로젝트/아카이뷰 2024. 1. 23. 08:52
Query DSL 동적 쿼리 왜 궁금했을까❓Query DSL을 아카이뷰 프로젝트에 적용하는 과정을 보도록 하겠다. [Spring boot] Query DSLQuery DSL 왜 궁금했을까❓ArchiVIEW의 검색 API를 만들어야 했는데 필터가 존재하여 Spring Data JPA를 사용하기에는 경우의 수를 고려하여 쿼리를 만들어야 했다. 상당히 비효율적이라 생각하여 동적 쿼pslog.co.kr위 포스팅을 통해 Query DSL에 대한 개념을 이해할 수 있다.Query DSL 실습Gradle 설정(Spring Boot 3.x)Query DSL은 JPA 표준이 아니기 때문에 별도로 라이브러리를 추가해야 한다.// QueryDSLimplementation 'com.querydsl:querydsl-jpa:5...
-
[Spring boot] REST, REST API, RESTful프로젝트/아카이뷰 2024. 1. 22. 17:31
REST, REST API, RESTFul 왜 궁금했을까❓API를 통해서 단순히 자원을 교환하는 것을 REST API 서버라고 알고 있었다. 알고보니 규칙이라는 것이 존재했고 그 규칙을 만족해야 REST API 서버라고 부른다는 것을 알았다. 이에 따라 REST의 정의와 규칙에 대해서 깊게 알아보고 ArchiVIEW 프로젝트에 적용해 보려고 한다.REST란?Representational State Transfer의 약자로 자원을 이름으로 구분하여 자원의 정보를 주고받는 것을 의미하여 자원의 표현에 의한 상태 전달을 뜻한다. 1. 자원(resource)의 표현(representation)자원 - 소프트웨어가 관리하는 모든 것ex) 데이터, 그림, 문서 등자원의 표현 - 위 자원들을 표현하기 위한 이름ex)..
-
[Spring boot] JPA N + 1프로젝트/아카이뷰 2024. 1. 21. 21:02
JPA N + 1 왜 궁금했을까❓ArchiVIEW 프로젝트에서 JPA를 활용하여 DB 데이터를 조회하고 있었다. console을 보니 MyBatis에서는 하나의 쿼리로 처리했던 것들이 여러 개의 쿼리로 나눠져서 나가고 있는 것을 확인했다. 이를 찾아보니 N + 1 문제라고 지칭하는 것을 알았고 이를 해결해보려고 한다. [Spring boot] JPA(Java Persistence API)JPA(Java Persistence API) 왜 궁금했을까❓SSAFY 1학기 프로젝트인 Share Your Trip을 할 때, MyBatis를 사용해서 DB에 Query를 날리곤 했는데 타입이나 변수명 등 Java 객체와 불일치 하는 경우가 많아 오류가 많pslog.co.kr [Spring boot] JPA save..
-
[Spring boot] Query DSL프로젝트/아카이뷰 2024. 1. 20. 08:56
Query DSL 왜 궁금했을까❓ArchiVIEW의 검색 API를 만들어야 했는데 필터가 존재하여 Spring Data JPA를 사용하기에는 경우의 수를 고려하여 쿼리를 만들어야 했다. 상당히 비효율적이라 생각하여 동적 쿼리를 지원하는 JPQL과 Query DSL을 고민하던 중 compile시 타입 체크가 가능하여 runtime시 좀 더 안정성있는 Query DSL을 채택했다. Query DSL이란?Query DSL은 정적 타입을 이용하여 SQL 쿼리를 생성하도록 도와주는 프레임워크 Query DSL을 사용하는 이유1. 정적 타입 체크를 통한 안정성 향상JPQL은 개발자가 직접 SQL 쿼리문을 작성하여 오타가 발생할 수 있다. 또한, 컴파일 단계에서 오류가 존재하는지 체크할 수 없다는 문제점이 존재한다...
-
[Spring boot] JPA save() & Dirty Checking프로젝트/아카이뷰 2024. 1. 19. 08:52
JPA 메소드인 SAVE() 왜 궁금했을까❓JPA의 save()를 이용하여 객체를 데이터베이스에 저장하곤 했는데 Dirty Checking을 통해 저장하는 방식이 존재한다는 것을 알고 그 원리가 궁금해서 save()와 함께 학습해보려고 한다. SAVE() 동작 원리JPA에서 save()를 사용할 때, Spring Data JPA에서 제공하는 JpaRepository.save(T)를 사용하게 된다. 해당 메소드 코드를 보며 분석하고 그 원리를 학습하고자 한다.isNew() 메소드는 Entity가 새로운 것인지 아닌지 판단하는 메소드이다.일반적으로는 Entity ID의 null 여부에 따라 결정된다.Entity에 @Id와 @GeneratedValue를 사용할 경우 ID는 persist()를 호출한 이후에 I..
-
[Spring boot] NoArgsConstructor에 Protected를 쓰는 이유프로젝트/아카이뷰 2024. 1. 18. 16:26
NoArgsConstructor에 Protected를 쓰는 이유가 왜 궁금했을까❓ArchiVIEW 프로젝트에서 JPA Entity를 설정하기 위해 공부를 하다보니 대부분의 블로그에서 NoArgsConstructor에 Protected 옵션을 주고 사용하고 있었다. 단순히 코드를 따라치기보다는 이해하고 사용하기 위해 학습해보려고 한다. NoArgsConstructor(AccessLevel.PROTECTED)를 왜 사용하는 걸까?일반적으로 객체를 생성하는 방법에는 3가지 방법이 존재한다.기본 생성자를 통해 객체를 생성하고 Setter를 통해 값을 주입하는 방법각 매개변수를 가지는 생성자를 통해 객체의 생성과 초기화를 동시에 하는 방법정적 팩토리 메소드 / 빌더 패턴을 통해 객체 생성과 초기화를 동시에 하는 ..
-
[Spring boot] Controller Payload 유효성 검증프로젝트/아카이뷰 2024. 1. 17. 09:54
@Controller Payload 유효성 검증 왜 궁금했을까❓클라이언트로부터 전송되는 API Payload에 대해서 검증이 이뤄지지 않아 비즈니스 로직에서 에러가 발생하며 SQL Injection이나 Command Injection과 같은 공격에 대한 취약점이 존재할 수 있을 것이라 생각했다. 요청 API 처리의 시작부분인 Controller에서 Payload를 검증하여 보안성과 안정성을 향상시키고자 한다.@Valid / @ValidatedSpring Boot에서 유효성을 검증하는 어노테이션은 두 가지가 존재한다. 각 어노테이션의 차이점을 알아보고 코드에 적용해보도록 하겠다.1. @Valid@Valid는 JSR-303 표준 스펙으로 Bean Validator를 이용해 객체의 제약 조건을 검증하는 어노테..