본문 바로가기

Server Development

(64)
Spring - Interceptor Interceptor - DispatcherServlet과 Controller 사이에서 Client의 요청을 가로채서 특정 작업을 수행 후 Controller에게 전달하는 역할 - Spring Boot에서는 HandlerInterceptor로 구현 HandlerInterceptor를 추가한 Spring의 기본 동작 구조는 다음과 같다. Client(Request) -> WAS(HttpServletRequest, HttpServletResponse 생성)-> Filter(Encoding등 처리) -> DispatcherServlet -> HandlerMapping(Controller Mapping) -> Dispatcher Servlet -> HandlerInterceptor -> Handler(Contr..
Cache - Redis 백엔드에서는 여러 스레드를 통해 이미 생성된 인스턴스들로 다양한 데이터를 CRUD를 한다. 하지만 항상 모든 데이터에 대해서 데이터베이스에서 가져오는 것은 데이터베이스에 큰 부하가되며 이어져 서버에도 많은 부하를 줄 수 있다. 또한 이런 현상은 서버의 전반적인 속도를 늦추는 문제가 생긴다. 이럴 때 사용하는 것이 캐시이다. Cache - 자주 사용하는 데이터를 미리 보관해둔 임시 저장소 - 저장 공간이 적고 비용이 좀 비쌈. - 빠른 I/O 가 가능하다. 캐시를 사용하는 사례 - 자주 호출되지만 프로그램 도중에 잘 변경되지 않는 데이터 Spring boot의 캐시 - JSR(Java Specification Requests) : 자바로 만들어진 플랫폼에 대한 규격을 제안하거나 기술한 것. - JSR-10..
Spring - Jasypt JASYPT - 프로젝트에 간단한 암호화 기능을 제공해주는 JAVA 라이브러리 이다. - 단방향, 양방향 암호화 기능을 제공한다. - 스프링과 같은 싱글톤 환경에서 멀티스레드의 동기화 문제 걱정없이 사용 가능. (여러개의 스레드가 하나의 자원에 동시에 접근할 때 생기는 문제가 없다.) - 다양한 언어를 지원해 원본 문자 사용에 대한 제약이 없다. (인코딩에 대한 제약이 없다, 즉, 한글을 암호화하는 것도 가능하다.) 1. Dependancy 설정 com.github.ulisesbocchio jasypt-spring-boot-starter 3.0.5 2. Config 클래스 설정 package com.ReservationServer1.config; import org.jasypt.encryption.Str..
Spring - Multiple Requests, Threads 스프링에서는 많은 요청을 기본적으로 어떻게 처리되는지 그 방식이 궁금했다. 예를 들어, JPA에서는 영속 컨텍스트 안에 데이터 처리 요청이 들어오면 인스턴스가 생기고 그런 인스턴스들을 관리하다 트랜잭션이 끝남과 동시에 영속 컨텍스트는 종료된다. 스프링에서는 자체 내장된 tomcat container(context)를 사용한다. 앞서 설명한 영속 컨텍스트와 기본적으로는 동일한 개념이다. 사용자가 서버에 접속하면 스레드(인스턴스)가 생성되고 이를 활용해 여러 작업을 하는 것이다. 방식은 다음과 같다. 1. 서버 시작시 Tomcat은 스레드의 컬렉션으로 Thread Pool을 생성 2. HttpServeletRequest(Client의 요청, HTTP통신 , ServerSocket에서 accept한 객체)시 ..
JPA - @Query with Spring JPA 우리는 항상 쿼리메서드를 통해서나 JPARepository에서 제공해주는 기본 메서드를 사용해 모든 데이터를 처리하기에는 한계가 있다. 데이터베이스가 복잡해질 수록 정리할 데이터가 많아질수록 또 여러가지 서비스를 하면서 결국에는 쿼리문을 작성해야하는 경우가 생긴다. 다만, MyBatis보단 기본적으로 많은 양의 쿼리문을 지원해주기에 좀 더 낫기도 하면서 결국에는 쿼리문 대신 메서드를 다 숙지해야한다는 점에서 상속 관계에 속한다. 아무튼, 이번에는 이런 경우를 대비해 JPA에서 쿼리문을 작성하는법을 적어보려고 한다. @Query - JPQL로 쿼리를 작성하는 방법 - Native Query로 작성하는 것도 지원해줌. - Spring Data JPA에서 제공 - JPQL 문법은 SQL과 유사하며 객체지향적인..
JPA - Query Method with Spring JPA 지금까지 Spring Data JPA의 JpaRepository의 기본 메서드(save() 등)를 사용하거나 JPA의 기본 메서드(persist() 등)을 사용해 DB에 CRUD를 했다. 항상 이렇게 사용하는데는 어디까지는 한계가 있다. 따라서 직접 필요한 경우에 한하여 쿼리문을 생성하는 방법에 대해서 알아보려고 한다. JPQL - Java Persistence Query Language - 테이블이 아닌 엔터티를 대상으로 하는 객체지향 쿼리 - JPA는 JPQL을 베이스로 함. - JPA가 작성하는 쿼리문을 JPQL이라고 생각하면 쉽고 이를 설정들을 통해서 각 DB에 맞는 쿼리로 변경해주는 형태임. Query Method - Spring Data JPA에서 제공 - 여전히 쿼리를 직접 짜는 것이 아닌 ..
JPA - Auditing JPA를 사용하면서 한가지 항상 해야할 것이 있다. 항상 DTO를 Entity로 바꿔주는 일이다. 이러한 과정을 거칠 때면 한가지 상황이 생길 수 있다. 예를들어 DTO는 아이디, 비밀번호로 구성이 되어있고 Entity는 아이디, 비밀번호, 생성일자, 최근 수정일자, 생성한 사람, 수정한 사람의 프로퍼티로 구성되어있다고 가정하자. MappedSuperClass 이 때, 추가적인 정보들에 대해서 또한 자주 다른 Entity 생성시에도 저런 정보가 계속 추가된다면, 하나로 묶어놓고 항상 자동으로 생성해 삽입된다면 굉장히 편할 것이다. JPA Auditing 사전적인 의미로는 감사, 감시라는 의미이다. 리스너처럼 JPA의 상황을 주시하다가 특정 동작을 수행(누가, 언제 이 엔터티에 접근했는지 변경했는지)하는 ..
JPA - EntityManager, EntityMapping, Context 이번에는 ORM-JPA-Hibernate 가 어떻게 동작을 하는지 자세히 알아보려고 한다. 또한 Spring Data JPA를 사용하는 것과 안하는 것의 차이 또한 같이 알아보려고 한다. 데이터를 처리하는 Layer를 DAO라고 하고 저장하려는 DB가 Mysql이라고 가정하자. 이때, 동작 과정은 다음과 같을 것이다. DAO에 데이터 전달 DAO가 MySql에 데이터 전달 Mysql은 데이터 저장 Mysql은 데이터를 DAO에게 반환한다. 이 때, 서로 데이터 전달, 반환을 돕는 것을 JPA가 한다고 하였다. 내부 구조를 좀 더 상세히 보려고 한다. Service Layer에서 DTO를 Entity로 변환 후 DAO에 전달 DAO는 설정 정보를 주입받은 EntityManagerFactory 객체 생성 E..