JPA의 쿼리 메서드와 @Query를 통해 많은 기능을 구현할 수는 있으나 선언할 때 고정된 형태의 값을 가진다는 단점이 있다. 이 때문에 단순한 몇 가지의 검색 조건을 만들어야 하는 상황에서는 기본 기능만으로 충분하지만, 복잡한 조합을 이용하는 경우의 수가 많은 상황에서는 동적으로 쿼리를 생성해서 처리할 수 있는 기능이 필요하다. 이럴때 Querydsl을 이용하면 복잡한 검색조건이나 조인,서브 쿼리 등의 기능도 구현이 가능하다. SQL, JPQL의 문제점 문자열이며 Type-check가 불가능 하다. 잘 해봐야 어플리케이션 로딩 시점에 알 수 있고 컴파일 시점에 알 수 있는 방법이 없다.(자바와 문자열의 한계) 해당 로직 실행 전까지 작동여부 확인을 할 수 없다. 해당 쿼리 실행 시점에 오류를 발견한다..
코드로 배우는 스프링부트 웹 프로젝트
엔티티와 관련된 작업을 하다 보면, 데이터의 등록 시간과 수정 시간과 같이 자동으로 추가되고 변경되어야 하는 칼럼들이 있다. 이를 자동으로 처리할 수 있도록 어노테이션을 이용하여 설정한다. 이를 적용하기 위한 예로 프로젝트내에 entity 패키지를 생성 후, 엔티티 객체의 등록 시간과 최종 수정 시간을 담당하게 될 BaseEntity 클래스를 추상클래스로 작성한다. 1. entity패키지 생성 후, 자동 엔티티 객체를 정의하는 추상클래스 작성 @MappedSuperclass : 해당 어노테이션이 적용된 클래스는 테이블로 생성되지 않는다. 따라서 실제 테이블은 BaseEntity클래스를 상속한 엔티티의 클래스로 DB 테이블이 생성된다. @CreatedDate : JPA에서 엔티티의 생성 시간을 처리 @La..
Thymeleaf(타임리프): 흔히 View Template이라고 부른다. 뷰 템플릿은 컨트롤러가 전달하는 데이터를 이용하여 동적으로 화면을 구성할 수 있게 해준다. 스프링 부트는 설정을 통해서 JSP 등을 사용할 수도 있지만 기본적으로 JSP 대신에 Thymeleaf나 FreeMarker, Mustache 등을 이용해서 화면을 처리한다. Thymeleaf를 이용하는 이유는 다음과 같다. JSP와 유사하게 ${}을 별도의 처리 없이 이용할 수 있다. Model에 담긴 객체를 화면에서 JavaScript로 처리하기 편하다. 연산이나 포맷과 관련된 기능을 추가적인 개발 없이 지원한다. 개발 도구를 이용할 때 .html파일로 생성하는데 문제가 없고 별도의 확장자를 이용하지 않는다. 사용법) 예제를 위해 dto..
MVC(Model - View - Controller)패턴 MVC패턴은 디자인패턴( 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 특정한 "규약"을 통해 쉽게 쓸 수 있는 형태로 만든 것 )중 하나이다. 사용자가 controller를 조작하면 controller는 model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다. 위는 하나의 로직을 설명하기 위해 만든 그림이고 사실 MVC 패턴의 구조는 이 그림이 더 어울린다. Controller가 view에도 영향을 미치는(화살표를 보자) 부분이 있어야 한다. 위 그림과 같이 모델은 데이터(변수,쿼리등)을 가..
다양한 검색 조건에 대한 부분(특정한 범위, like 처리, 여러 검색 조건)을 위해 JPA가 제공하는 방식 쿼리 메서드 : 메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능 @Query: SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능 쿼리 메서드) 주로 SQL에서 사용되는 키워드와 동일하게 작성되어 있음 select를 하는 작업이라면 List 타입이나 배열을 이용할 수 있음 파라미터에 Pageable 타입을 넣는 경우 무조건 Page 타입 'Spring Data JPA Reference'를 이용하여 찾아볼 수 있음 쿼리 메서드 예제1) Memo 객체의 mno 값이 70~80 사이의 객체들을 구하고 mno를 역순으로 정렬 인터페이스 추가) 테스트 클래스) 쿼리메서드 예제2) 쿼..
JPA에서 페이징 처리와 정렬은 findAll() 메서드를 사용 findAll()은 파라미터로 전달되는 Pageable 타입의 객체에 의해서 실행되는 쿼리를 결정 여기서 주의사항은 Page 타입으로 지정하는 경우 반드시 파라미터를 Pageable 타입을 이용 Pageable interface: 페이지 처리에 필요한 정보를 전달하는 용도의 타입 Pageable 인터페이스는 정보 전달의 용도의 타입으로, 실제 객체를 생성할 때는 구현체인 PageRequest 클래스를 이용 객체를 생성하기 위해 static한 of()를 이용하여 처리 페이징 처리) PageRequest.of()를 이용하여 1페이지의 데이터 10개를 가져옴 (JPA의 페이지 처리는 반드시 '0'부터 시작) Page타입은 단순히 해당 목록만으로 ..
ORM(Object Relational Mapping) : 객체지향 패러다임을 관계형 데이터베이스에 보존하는 기술 관계형 데이터 베이스를 다루는 입장에서 클래스는 아니지만 새로운 테이블에 칼럼을 정의하고 칼럼에 맞는 데이터 타입을 지정해서 데이터를 보관한다는 틀을 만든다는 의미에서 클래스와 상당히 유사하다는 점을 기반 즉, ORM은 '객체지향'과 '관계형' 사이의 변환 기법을 의미 JPA(Java Persistence API) : ORM을 Java 언어에 맞게 사용하는 '스펙' 위의 JPA의 정의에 따라 ORM이 좀 더 상위 개념이 되고, JPA는 Java라는 언어에 국한된 개념으로 볼 수 있다. JPA는 단순한 스펙이기 때문에 해당 스펙을 구현하는 구현체마다 회사의 이름이나 프레임워크의 이름이 다르게 ..