본문 바로가기

dev/Spring

JPQL, Criteria JPQL 개요 JPA에서 사용되는 JPQL은 SQL 쿼리를 추상화 한다. 즉 하나의 쿼리 언어를 통해 다양한 DB를 사용할 수 있다. JPQL은 SQL문과 유사하지만, 다른 점이 존재하기 때문에 이를 고려해 사용해야 한다. 예를 들어 inline view를 사용할 수 없고, insert 문이 존재하지 않는다(Entity manager를 사용해야 한다). 한편, JPQL의 대상은 테이블이 아닌 객체라는 것 또한 고려해야 한다. 즉, JPQL은 DB 테이블과 직접적인 의존관계를 지니지 않는다는 것을 생각해야 한다. 기본 질의 JPQL은 기본적으로 SQL 문법과 유사한 구조를 가지고 있다. // SELECT SELECT ... FROM ... [WHERE ...] [GROUP BY ... [HAVING .....
Java Date와 Spring boot JPA(Hibrnate) Java8 이전의 Date는 불변 객체가 아니라는 점, 상수 필드 남용 및 일관성 없는 상수값 등 많은 문제점을 가지고 있다. (참조 : 머루의 개발블로그, Java의 Date) Java8 이후에는 LocalDateTime을 사용해 기존의 문제를 대부분 해결 가능하다. Java8을 사용할 수 없는 상황이라면, joda-time을 사용할 수 있으며 안드로이드의 경우 date4j를 사용할 수 있다. 한편, Spring JPA에서 LocalDateTime을 사용할 때는 Spring boot의 버전을 고려해야 한다. Java 8의 날짜와 시간 클래스는 Hibernate 5.3(JPA 2.2) 부터 별도의 설정 없이도 정상적으로 사용 가능하다. Spring boot는 2.1 버전부터 Hibernate 5.3을 지..
spring data jpa 사용자 정의 repository 프로젝트를 하며 spring data jpa를 사용하는데, 직접 메소드를 구현하고 싶었다.DB에 데이터를 입력하기 전에 처리하고 싶은 작업이 있었는데, 쿼리가 복잡할 것 같기 때문이었다.검색해 보니 이 경우 커스텀 레포지토리를 정의하여 사용하면 된다고 한다. 물론 JpaRepository 인터페이스를 통째로 구현하는 방법도 있지만..간단히 JpaRepository가 제공하는 기능을 사용하되, 커스텀 기능을 추가하는 방법을 조사했다. 1. 커스텀 레포지토리 인터페이스를 작성한다.public interface CustomEmpRepository {public List customMethod();} 2. 1에서 작성한 인터페이스를 구현하는 클래스를 작성한다.- 이 클래스의 이름은 default spring d..
Advice를 이용한 예외 처리 - IdAlreadyExistExceptionpublic class IdAlreadyExistingException extends RuntimeException { public IdAlreadyExistingException(String userId){ super("user id \""+userId+"\" is already exist"); } } - UserExceptionAdvice@ControllerAdvice public class UsersExceptionAdvice { @ResponseBody @ExceptionHandler(IdAlreadyExistingException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) String idAlreadyExist..
spring data jpa에서 enum 사용 방법 엔티티 클래스 중, Enum 값을 가지는 필드에 @Enumerated 를 붙여준다.@Enumerated에는 EnumType.STRING 혹은 EnumType.ORDINAL을 인자로 전달할 수 있다.둘의 차이는 다음과 같다. @Enumerated(EnumType.STRING) Rating rating the value of rating.name() is written and read from the corresponding database column; e.g. G, PG, PG13 @Enumerated(EnumType.ORDINAL) Rating rating the value of rating.ordinal() is written and read from the corresponding database ..
파일 업다운로드 기본설정, 멀티파트 미디어 타입 1. 멀티파트 미디어 타입 POST 방식의 전송은 POST body에 데이터를 포함시켜 전송한다. 이 때, 다음 두 가지 방식을 사용할 수 있다.application/x-www-form-urlencoded : 일반 파라미터만 전송 가능multipart/form-data : 파일 전송 가능multipart 미디어 타입은 단일 body에 다중 resource로 설계된 타입이다.이미지에서 볼 수 있듯 하나의 body에 여러 컨텐츠가 포함되며 각 컨텐츠는 boundary로 구분된다.특히 마지막 boundary의 끝에는 --가 붙어 body의 끝을 알린다. (이는 모두 HTTP 통신 규격에 따른다.)만약 데이터의 크기가 패킷 크기보다 크다면(1500byte), 여러 패킷으로 쪼개져서 전송된다. 2. spring ..
로깅, SLF4J 1. SLF4J로깅 패사드로깅에 대한 추상화된 인터페이스를 제공해준다.즉, SLF4J를 사용하면 로깅 라이브러리에 대한 의존성을 제거해준다.(손쉬운 모듈 교체 가능) 2. spring에서 SLF4J 사용하기 1) spring 기본 로깅 모듈 제거spring은 기본적으로 common-logging을 사용이를 제거하고 slf4를 추가org.springframeworkspring-context${spring.version}commons-logging commons-logging 2) jcl-over-slf4 추가commons-logging을 대체하는 SLF4J 라이브러리추가하지 않으면 spring은 commons-logging을 찾지 못했다는 오류를 발생시킨다. org.slf4jjcl-over-slf4j1.7..
인터셉터, 서블릿 필터 1. filter(servlet filter)Request가 들어오기 전, Response가 나가기 전 적용(선처리, 후처리 작업)web.xml 에 등록하여 사용 2. 인터셉터DispatcherServlet과 handler 사이에 요청을 보내기 전, 받기 전에 적용(선처리, 후처리 작업)컨트롤러에 대한 공통된 작업을 처리하는데 사용할 수 있다.