본문 바로가기

분류 전체보기311

Spring Data Common - QueryDSL 쿼리 메소드는 대부분 두 가지 중 하나로 결정된다. Optional findOne(Predicate) : 어떤 조건으로 1개를 찾는다. List|Page|Iterable ... findAll(Predicate) : 어떤 조건으로 여러개를 찾는다. 스프링 데이터는 QuerydslPredicateExecutor 인터페이스를 제공한다. 여러 메소드가 있지만 위의 2가지가 대표적이다. 너무 긴 쿼리메소드는 무엇을 실행시키는지 읽기가 너무 어렵다 그래서 쿼리 DSL 을 사용한다. QueryDSL query domain specific lanaguage (쿼리 도메인 특화 언어) 를 말한다. 타입-세이프한 쿼리를 만들 수 있도록 돕는 라이브러리이다. JPA, SQL, MongoDB, JDO, Lucene, Coll.. 2021. 2. 10.
Spring Data Common - 도메인 이벤트 이벤트 프로그래밍 스프링 프레임워크는 이벤트 기능을 제공한다. ApplicationContext 는 BeanFactory 인터페이스를 상속받았고, ApplicationEventPublisher 인터페이스도 상속받은 인터페이스이다. 이벤트는 ApplicationEvent 를 상속받아 만들면 되고, 리스너는 ApplicationListener를 구현하여 만들면 된다. 또는 스프링부트가 제공하는 어노테이션 @EventListener를 사용해도 된다. 1 이벤트 생성 @Getter public class PostPublishEvent extends ApplicationEvent { private final Post post; public PostPublishEvent(Object source) { super(s.. 2021. 2. 10.
Spring Data Common - 커스텀 Repository Spring Data JPA - Repository Custom Repository 짤막한 Intellij 단축키 Tip command + 1 : 왼쪽 옆에 프로젝트 창 커서가도록 하기 esc : 다시 코드 창으로 커서가 온다. command + ` : 프로젝트 2개이상 띄워져있을 때 프로젝트 변경 shift + command + T : Test 로 탭 전환 쿼리 메소드(쿼리 생성 및 쿼리 찾아쓰기)로 해결되지 않는 경우 코딩으로 스프링 데이터 리포지토리 인터페이스에 필요한 기능을 직접 구현 가능하다. 1) 새로운 기능을 추가 테스트 코드 @DataJpaTest class PostRepositoryTest { @Autowired PostRepository postRepository; @Test publi.. 2021. 2. 10.
Spring Data Common - 쿼리(Query) Spring Data JPA - Spring Data Common Query Spring Data 저장소의 메소드 이름으로 쿼리를 만들 수 있다. 1) 메소드 이름을 분석해서 쿼리를 만든다. (CREATE) 2) 미리 정의해 둔 쿼리를 찾아 사용한다. (USE_DECLARED_QUERY) 3) 미리 정의한 쿼리를 찾아보고 없으면 생성한다. (CREATE_IF_NOT_FOUND) 아래와 같이 설정할 수 있다. @SpringBootApplication @EnableJpaRepositories(queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND) public class Application { ... 기본값은 CREATE_IF_NOT_FOUND.. 2021. 2. 9.
Spring Data Common - Repository Spring Data Common Spring data 안에는 Spring data Common, Spring data REST 가 있고, JPA, JDBC, KeyValue, MongoDB, Redis 등이 있다. 스프링 데이터는 SQL, NoSQL 저장소를 지원하는 프로젝트의 묶음이다. 스프링 데이터 Common 은 여러 저장소를 지원하는 프로젝트의 공통 기능을 제공해준다. 스프링 데이터 REST 는 저장소의 데이터를 하이퍼미디어 기반 HTTP 리소스로(REST API로) 제공한다. 그리고, 스프링 데이터 JPA는 스프링 데이터 Common이 제공하는 기능에 JPA 관련 기능을 추가한 것이다. Spring Data Common (Spring data Common) Repository - 마커용 인터페.. 2021. 2. 8.
0207 같이 - 오늘의 생각 2020-02-07 삶을 살다보면 주어진 것에 안정감을 느끼며 그 상태에 머무르게 되는 경우가 있다. 혼자 사는 세상이면 그렇게 하더라도 문제가 없을 수 있다. 하지만 우리는 함께 살아간다. 나는 잘 지내고 있더라도, 나는 안정적이어도 주변을 돌아보는 시간을 가지는 것은 중요한 것 같다. 2021. 2. 7.
JPA 기본 - cascade, fetch, query JPA Cascade Cascade란 엔티티 상태를 전파시키는 옵션이다. 엔터티 상태란 다음 4가지를 말한다. Transient : 객체가 단지 선언되고 생성만 되었을 뿐 JPA 는 알지 못하는 상태다. Persistent : JPA가 관리중인 상태다. 예를 들어 Session.save() 할 때 이 상태가된다. Session 같은 PersistentContext 에 객체를 넣어준다. 그 외에 하이버네이트가 1차 캐시, Dirty Checking, Write Behind 등을 관리한다. 1차 캐시 : 객체 상태를 캐시에 저장한다. 예를 들어 이미 캐시에 어떤 데이터가 존재하면 load 명령을 해도 굳이 DB에서 가져오지 않고 있던 값을 사용하여 성능을 끌어올린다. Dirty Checking : 객체의 변.. 2021. 2. 7.
Spring REST API - 인증 Spring REST API - 인증 인증 엔터티를 하나 만들어보자. @Entity @Getter @Setter @EqualsAndHashCode(of = "id") @Builder @AllArgsConstructor @NoArgsConstructor public class Account { @Id @GeneratedValue private Integer id; private String email; private String password; @ElementCollection(fetch = FetchType.EAGER) @Enumerated(EnumType.STRING) private Set roles; } roles 필드는 권한 정보를 담고 있는 enum 타입의 필드이다. 여러 값을 가지는데, @El.. 2021. 1. 29.
인라인 코드블럭, 코드 강조, 코드 박스처리 인라인 코드블럭 이것을 보세요 위와 같은 강조 방법은 인라인 코드블럭을 사용한 방법입니다. 티스토리에서 인라인 코드블럭 방법을 사용하는 방법을 알아봅시다. 에디터에서 기본모드 화살표버튼을 누르시면, 마크다운과 HTML 이 있습니다. HTML 첫번째로 HTML 을 이용해보겠습니다. 태그로 원하는 내용을 감싸서 사용할 수 있습니다. inline codeblock Markdown 두번째로는 마크다운을 이용해보겠습니다. ` ` (backtick이라 읽음) 사이에 원하는 내용을 감싸서 사용할 수 있습니다. 이 방법은 결국 글이 등록되는 순간 위 html 의 code 태그 형태로 바뀌게 됩니다. 블럭 디자인 이제 이 코드 블럭을 디자인 해봅시다. 간단하게 css 설정을 하는 것이 좋아보입니다. 티스토리 관리자 메뉴.. 2021. 1. 28.
Spring REST API - 조회 테스트 Spring REST API - 조회 이벤트 목록 조회 이벤트 목록은 조회하는 API를 만들어보자 우선 만들 요건은 Event 30개가 담긴 목록이다. 각 이벤트는 Page 정보를 담고 있다. TDD 방식으로 먼저 테스트 작성 후 그에 맞는 소스코드를 만든다. @Test @DisplayName("30개의 이벤트를 10개씩 묶어서 두번재 페이지 조회") public void queryEvents() throws Exception { // Given IntStream.range(0, 30).forEach(this::generateEvent); // When this.mockMvc.perform(get("/api/events") .param("page", "1") .param("size", "10") .par.. 2021. 1. 28.
728x90