Spring
-
Spring - JPA findBy findAllBy 차이점Spring 2024. 3. 27. 23:04
JPA를 쓰다보면 findBy를 써야할지 findAllBy를 써야할지 고민이 생기는 경우가 있습니다. findBy와 findAllBy는 어떤 차이가 있을까요? 정답은 findBy와 findAllBy는 동일하게 작동합니다. List findBySomeCondition(); List findAllBySomeCondition(); findBy와 findAllBy는 동일한 쿼리가 수행됩니다. 메서드에서 쿼리를 파생할 때 Spring Data에서는 All 부분을 무시됩니다. 중요한 부분은 By 뒤에 오는 키워드이며, 그 뒤에 오는 모든 것은 필드 이름으로 취급됩니다. Any text between find (or other introducing keywords) and By is considered to be d..
-
Spring - JPA InvalidDataAccessApiUsageExceptionSpring 2024. 3. 25. 22:51
Spring JPA에서 @Query 어노테이션을 사용할 때 InvalidDataAccessApiUsage exception이 발생하는 경우가 있습니다. org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations 이 경우는 @Modifying 어노테이션을 추가해주면 해결됩니다. insert, update, delete 쿼리의 경우 붙여주어야 합니다. @Repository public interface UserRepository extends JpaRepository { @Query("delete ..
-
Spring - JPA @Modifying return valueSpring 2024. 3. 25. 22:40
JPA에서 @Modifying 어노테이션 사용 시 주의할 점에 대해서 알아보겠습니다. @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String name; private String email; private boolean active; } JPA에서 @Query 어노테이션은 특정 JPQL 또는 SQL 쿼리를 작성할 수 있는 기회를 제공합니다. @Modifying 어노테이션은 @Query 어노테이션을 향상시켜 SELECT 쿼리뿐만 아니라 INSERT, UPDATE, DELETE, 심지어 DDL 쿼리까지 실행할 수 있습니다..
-
Spring - JPA distinct 여러 컬럼 사용하기Spring 2024. 3. 12. 22:34
Spring JPA를 사용할 때 distinct를 사용하는 경우 @Query 어노테이션을 사용해서 처리합니다. distinct 여러 컬럼을 할 때의 코드에 대해서 알아보겠습니다. JPA repository 코드 @Query(value = "select distinct type, code from table", nativeQuery = true) List findDistinct(); distinct 컬럼 한 개일때는 String으로 처리가 가능하지만, 두개 이상의 경우에는 Object로 결과값을 받아야 합니다. JPA repository 조회하는 Service layer List objects = repository.findDistinct(); List result = objects.stream() .ma..
-
Spring - JPA on duplicate key update (MySQL)Spring 2024. 2. 13. 20:34
MySQL에서 데이터가 없을 때는 INSERT, 데이터가 있을 때는 UPDATE를 수행하는 방법 중 하나가 INSERT ON DUPLICATE KEY UPDATE 구문을 사용하는 것입니다. INSERT INTO 테이블명 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...) ON DUPLICATE KEY UPDATE 컬럼1 = 값1, 컬럼2 = 값2, ...; 그러나 Spring Data JPA 직접적으로 INSERT ON DUPLICATE KEY UPDATE 구문을 지원하지 않습니다. ON DUPLICATE KEY UPDATE는 MySQL과 같은 특정 데이터베이스에 특화된 기능이기 때문입니다. 그래서 JPA에서 ON DUPLICATE KEY UPDATE 구문을 사용하려면 @Query 어노테이..
-
Spring - JPA Entity에서 @Column 필드 리스트로 만들기Spring 2024. 2. 13. 20:23
JPA Entity에서 @Column 어노테이션은 객체 필드와 DB 테이블 컬럼을 맵핑합니다. @Table(name = "entity") public class Entity { @Column(name = "id") private Long id; @Column(name = "name") private String name; @Column(name = "age") private Long age; } Entity 클래스에 매핑된 모든 컬럼명을 나열하려면 Java Reflection을 사용하여 클래스 필드에 액세스한 다음 @Column 주석이 있는지 확인할 수 있습니다. 방법은 다음과 같습니다. 1. 클래스의 모든 필드를 가져옵니다. 2. 각 필드에 @Column annotation이 있는지 확인하세요. 3. ..
-
Spring - Resilience4j circuit breaker exampleSpring 2024. 1. 9. 22:20
Resilience4j는 내결함성(fault tolerance) 라이브러리다. Netflix Hystrix는 더이상 개발되지 않아 Resilience4j 사용을 권장하고 있습니다. Resilience4j는 다음과 같은 모듈을 제공합니다. - circuitbreaker - ratelimiter - bulkhead - retry - timelimiter - cache CircuitBreaker Config import io.github.resilience4j.circuitbreaker.CircuitBreaker; import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig; import org.springframework.context.annotati..
-
Spring - JPA Executing an update/delete query 에러Spring 2023. 10. 17. 22:06
JPA를 사용하다가 보면 TransactionRequiredException 에러가 발생하는 경우가 있습니다. javax.persistence.TransactionRequiredException: Executing an update/delete query 에러가 나는 이유는 UPDATE, DELETE query를 날릴 때 Transaction이 필요하기 때문입니다. update, delete query의 경우 transaction 처리가 필요합니다. 해결 방법은 @Transactional 어노테이션을 붙여주면 됩니다.