일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Spring Security
- Application Runner
- 리소스 서버
- 백기선
- JsonSerializer
- 정적 리소스
- HATEOAS
- HttpMessageConverters
- WebApplication Type
- 스프링부트
- 알고리즘
- AuthenticationPrincipal
- 브루트포스
- OAuth2
- Application Argument
- rest api
- 스프링 부트
- JPA
- cors
- 다익스트라
- 리소스핸들러
- @Profile
- @ConfigurationProperties
- EnableAutoConfiguration
- 외부설정
- application.properties
- 백트래킹
- webjar
- 백준
- Application Event
- Today
- Total
목록분류 전체보기 (114)
아카이브
엔티티의 변경 시점에 언제, 누가 변경했는지에 대한 정보를 기록하는 기능 아쉽지만 이 기능은 스프링 부트가 자동 설정해주지 않습니다. 메인 애플리케이션 위에 @EnableJpaAuditing 추가(@EnableJpaAuditing에 AuditorAware 빈 이름 설정하기) @SpringBootApplication @EnableJpaAuditing(auditorAwareRef = "accountAuditAware") @EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND , repositoryImplementationPostfix = "Impl" , repositoryBaseClass = SimpleY..
스프링 데이터 JPA가 제공하는 Repository의 모든 메서드에는 기본적으로 @Transaction이 적용되어 있습니다. 스프링 프레임워크가 제공하는 트랜잭션 기능과 거의 흡사하여 JPA 특화라고 보기는 어렵다 스프링 @Transactional Transactional (Spring Framework 5.3.3 API) Defines zero (0) or more exception names (for exceptions which must be a subclass of Throwable), indicating which exception types must cause a transaction rollback. This can be a substring of a fully qualified class ..
에릭 에반스의 책 DDD에서 언급하는 Specification 개념을 차용한 것으로 QueryDSL의 Predicate와 비슷합니다. 장점 서버쪽 설정이 필요하지만, 클라이언트 코드가 간결해진다. Spec 정의에 따라 가독성이 달라진다. QueryDSL의 predicate와 Specification을 사용하여 Repository에 쿼리 메서드를 간결하게 구성할 수 있다. 다양한 기능을 구현할 수 있다. (대신 테스트가 철저해야 함) 설정하는 방법 https://docs.jboss.org/hibernate/stable/jpamodelgen/reference/en-US/html_single/ Hibernate JPA 2 Metamodel Generator The structure of the metamode..
엔티티의 일부 데이터만 가져오기 인터페이스 기반 Projection Nested 프로젝션 가능 Closed 프로젝션 일부만 가져오기 쿼리를 최적화할 수 있다. 가져오려는 애트리뷰트가 뭔지 알고 있으니까 Java 8의 디폴트 메서드를 사용해서 연산을 할 수 있다 Open 프로젝션 전부 다 가져와서 가공하기 @Value(SpEL)을 사용해서 연산할 수 있다. 스프링 빈의 메서드 호출도 가능 쿼리 최적화를 할 수 없다. SpEL을 엔티티 대상으로 사용하기 때문에 클래스 기반 Projection DTO Lombok @Value로 코드 줄일 수 있음 다이내믹 Projection 프로젝션용 메서드 하나만 정의하고, 실제 프로젝션 타입은 파라미터로 전달하기 List findByPost_Id(Long id, Class..
쿼리 메서드마다 연관 관계의 Fetch 모드를 설정할 수 있습니다. 경우에 따라 다른 Fetch 모드가 필요할때 사용한다. @NamedEntityGraph @Entity에서 재사용할 여러 엔티티 그룹을 정의할 때 사용 @NamedEntityGraph를 여러개 정의할 수도 있음 Comment Entity 클래스 @NamedEntityGraph(name = "Comment.post", attributeNodes = @NamedAttributeNode("post")) @Entity @Getter @Setter public class Comment { @Id @GeneratedValue private Long id; private String comment; /* * ManyToOne에서 fetch defaul..
쿼리 생성하기 find... count... delete... 흠.. update는 어떻게 하지? Update 또는 Delete 쿼리 직접 정의하기 @Modifying @Query (추천하지 않습니다) @Modifying(clearAutomatically = true, flushAutomatically = true) // flush -> update query -> PersistentContext를 clear -> DB에서 가져온다(context를 비워줘서 캐시에 없으니까) @Query("UPDATE Post p Set p.title = ?1 WHERE p.id = ?2") int updateTitle(String hibernate, Long id); 테스트 코드 /** * 한 @Transactional..
Named Parameter @Query에서 참조하는 매개변수를? 1,? 2 이렇게 채반으로 참조하는 게 아니라 이름으로 :title 이렇게 참조하는 방법은 다음과 같습니다. @Query("SELECT p FROM Post AS p WHERE p.title = :title") List findByTitle(@Param("title") String title, Sort sort); SpEL(Spring Expression Language) Core Technologies In the preceding scenario, using @Autowired works well and provides the desired modularity, but determining exactly where the autowir..
이전과 마찬가지로 Pageable이나 Sort를 매개변수로 사용할 수 있는데, @Query와 같이 사용할 때 제약 사항이 하나 있습니다. Order by 절에서 함수를 호출하는 경우에는 Sort를 사용하지 못합니다. 그 경우에는 JpaSort.unsafe()를 사용해야 합니다. Sort는 그 안에서 사용한 프로퍼티 또는 alias 가 엔티티에 없는 경우에는 예외가 발생합니다. JpaSort.unsafe()를 사용하면 함수 호출을 할 수 있습니다. PostRepository /** * Alias 줄 수 있음 * * @Query("SELECT p, p.title AS pTitle FROM Post AS p WHERE p.title = ?1") */ @Query("SELECT p FROM Post AS p W..
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation Spring Data JPA - Reference Documentation Example 109. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") ..
JpaRepository의 save()는 단순히 새 엔티티를 추가하는 메서드가 아닙니다 Transient(새로운) 상태의 객체라면 EntityManager.persist() Detached(이미 있는) 상태의 객체라면 EntityManager.merge() Transient인지 Detached 인지 어떻게 판단하는가? 엔티티의 @Id 프로퍼티가 null이면 Transient 상태로 판단하고 id가 null이 아니면 Detached 상태로 판단한다. @Id == null? Transient : Detached 엔티티가 Persistable 인터페이스를 구현하고 있다면 isNew() 메서드에 위임한다 JpaRepositoryFactory를 상속받는 클래스를 만들고 getEntityInfomration()을 ..