JPA를 사용하면서 엔티티의 상태 값 중 enum이 있을 때 enum의 순서(상수 값)나 이름(문자열 값)이 아니라 원하는 데이터를 저장하고 꺼내고 싶을 수 있습니다. JPA 2.1부터는 AttributeConverter를 제공하여 이것이 가능하도록 해줍니다. (JPA 구현체 중 Hibernate 5 기준입니다.) 문제 상황 예시 은행 코드 enum인 BankCode가 있습니다. DB에 저장할 때 BankCode의 코드 값이 DB에 저장되고, 엔티티로 직렬화 할 때도 코드 값을 통해 가능하도록 하고 싶습니다. 엔티티는 다음과 같습니다. @Entity public class BankTransaction { @Id @Column(name = "bank_transaction_id") private Long i..
요청 파라미터를 enum으로 변환하여 다루고 싶은 경우가 있습니다. 예를 들어 은행 코드와 같은 경우 004, 009와 같이 각 코드는 어떤 은행인지 알 수 있는 아이덴티티 역할을 합니다. 문자열과 enum의 이름이 같다면 자동으로 컨버팅해주지만 그렇지 않다면 다음과 같은 문제점이 있습니다. 휴먼 에러가 발생하기 쉽습니다. 프로젝트에 중간에 참여한 사람은 익숙하지 않아 알아보기 쉽지 않습니다. 별도의 유효성 체크가 필요합니다. Spring에서는 문자열을 enum으로 변환해주는 컨버터를 직접 만들어 적용시킬 수 있습니다. 문제 상황 예시 요청 파라미터로 은행코드를 받아 거래내역을 조회 하는 상황을 예로 들어보겠습니다. enum을 사용하지 않는다면 다음과 같이 작성할 수 있습니다. @GetMapping("/..
MSA(Microservice Architecture)란 단어를 들은 후 궁금해서 검색해 본 적이 있습니다. 글로 개념은 알 것 같았지만 직접 해보지 않았기 때문에 여러 것들을 검색해보다 실습형의 무료 세미나 영상을 보게 되었습니다. 영상 링크 세미나 목표 MSA와 Monolith의 차이점을 안다. Spring Cloud와 Netflix oss를 사용하여 실습해보면서 MSA를 간단하게 만들어본다. Circuit Breaker를 이해하고 Hystrix를 사용해본다. Client side Load Balancing을 이해하고 Ribbon을 사용해본다. Service registry를 이해하고 Eureka를 사용해본다. API Gateway를 이해하고 Zuul을 사용해본다. 후기 영상의 총 길이는 3시간 반정..
이번 포스팅은 객체지향 설계에 대해 고민하고 있을 때 좋은 참고가 된 세미나 내용에 대한 정리입니다. 유튜브에 1시간 40분 정도 길이의 영상이 있는데, 사실 이 영상을 3번째 보고 이제야 이해가 되어 포스팅을 하게 되었습니다. 개인 프로젝트와 여러 개념에 대해 더 알게 되면서 저도 성장했는지 매번 볼 때마다 이해도가 달랐습니다. 책도 그렇고 영상도 그렇고 사람은 아는 만큼 보인다고 볼 때마다 느끼는 점이 다른게 참 재미있는 것 같습니다. 이번 포스팅은 단순히 제가 중요하다고 생각한 포인트를 정리한 것입니다. 강의의 핵심인 의존성을 이용해 설계를 발전시키는 것은 담기가 힘듭니다. 꼭 영상을 한번 보는 것을 추천드립니다. 목차 세미나 목표 클래스 의존성의 종류 의존성 사이클 협력 설계하기 Aggregate..
목차 Query Cache란? MySQL Query Cache의 문제점 대안 Query Cache란? Query Cache란 SQL 실행 결과를 메모리에 저장해 둔 것을 의미합니다. SQL을 수행하면 [Query Parsing] -> [Optimization] -> [Execution] 과정을 거쳐 디스크에서 데이터를 읽습니다. 하지만 Query Cache를 사용하면 이러한 과정을 생략하고 같은 SQL이라면 메모리에서 바로 결과 값을 찾아서 사용할 수 있습니다. 몇 개의 레코드를 찾기 위해 몇 백만개의 레코드를 읽는 무거운 쿼리가 자주 사용된다면 Query Cache로 큰 이점을 얻을 수 있습니다. MySQL Query Cache의 문제점 MySQL은 자체적으로 Query Cache 기술을 지원했지만 5..
쿼리를 잘 짠다는 것의 척도가 되는 1순위는 성능일 것입니다. 이번 포스팅에서는 대다수의 성능의 원인이 되는 인덱스에 대해 공부한 내용을 적어보려합니다. 혹시나 잘못된 정보가 있다면 댓글로 알려 주시길 바랍니다. 목차 Index란? Index 저장 구조 인덱스 특징 Clustered Index & Non-Clustered Index Index 사용시 주의사항 Index란? 인덱스는 실생활에서 쉽게 볼 수 있습니다. 예를 하나 들면, 책의 찾아보기와 같습니다. 책의 찾아보기는 원하는 정보를 빠르게 접근할 수 있도록 도우면서 동시에 찾아보기 목록 또한 빠르게 찾을 수 있도록 사전순으로 정렬되어 있습니다. DB의 인덱스도 다르지 않습니다. Index는 원하는 데이터를 빠르게 조회하기 위해 정렬된 찾아보기와 같..
개요 Java GUI 로 게임을 만들어 보다가 다음과 같은 예외가 발생했다. 공식 문서에는 이렇게 정의되어 있다. This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible. ... 번역을 해보면 "이 예외는 동시 수정이 허용되지 않은 객체에서 동시 수정이 발생할 경우 수정을 감지한 메서드에서 throw 될 수 있다." 이다. 즉, 객체의 상태를 동시에 수정하는 것을 방지하고 싶을 때 throw 하는 예외이다. 해당 예외는 Collection을 사용하는 중 흔하게 만날 수 있으며 필자는 Java의 향상된 for문을 사용..
개요 SpringBoot를 사용하여 로컬에서 개발할 때 H2를 많이 사용하게 된다. h2는 일반적으로 h2-console이라는 웹 콘솔을 사용하여 데이터를 조회하고 조작할 수 있는데 기능적인 부족함과 편리성 때문에 IntelliJ Ultimate에 있는 Database도구를 사용해 연결할 수 있는 방법을 찾아보았다. 이번 포스팅에서는 설치형 H2가 아니라 SpringBoot에 의존성을 둔 H2 embedded DB를 사용하면서 IntelliJ에서 연결하는 방법을 알아본다. 목차 사용할 방법 .properties 파일 설정 IntelliJ 설정 사용할 방법 H2를 App에서 In-memory나 .db파일을 이용하여 내장 DB를 생성하면 JVM 내에 DB가 생성되기 때문에 외부의 다른 클라이언트(ex. In..
개요 이미지 파일을 저장하는 방법에는 크게 두 가지가 있다. 파일을 특정 위치에 저장하고, DB에 위치를 기록한다. 파일을 DataURL로 변환하여 DB에 저장한다. 이번 포스팅에서는 두번째 방법에 대해서 알아본다. 목차 DataURL DataURL 특징 DataURL 단점 DataURL DataURL 이란, 접두사(data:)가 붙은 URL이며, 바이너리 파일을 Base64로 인코딩하여 ASCII 문자열 형식으로 변환한 것이다. 기본적인 형식은 다음과 같다. data:[][;base64], 개발자 도구로 살펴보면 다음과 같이 나온다. DataURL 특징 DataURL을 DB에 저장하는 것은 파일을 DB에 저장하는 것과 같다. 파일의 크기가 커질수록 영역이 길어진다. disk cache 가 불가능하다. ..
http.rememberMe().rememberMeParameter("new-remember-me"); 개요 페이지 이동간의 로그인을 유지하기 위해서 세션과 세션을 찾을 수 있는 쿠키가 사용된다. 하지만 쿠키가 만료되거나 삭제되면 로그인을 다시 해주어야하는 번거로움이 있다. SpringSecurity에서는 Remember Me라는 기능을 제공하여 이를 해결한다. 이번 포스팅에서는 Spring에서 제공하는 Remember Me의 2가지 방식을 알아보려한다. 목차 로그인 쿠키 해시 기반의 쿠키 방식 : TokenBasedRememberMeServices PersistentTokenBasedRememberMeServices 로그인 쿠키 로그인 쿠키란, 세션 쿠키의 만료기간과 관계없이 로그인을 유지하기 위한 자..
개요 많은 사람들이 FrontEnd 라이브러리로 Bootstrap과 JQuery를 사용한다. 이것을 사용하는 방법은 다음과 같다. CDN 사용 직접 다운로드하여 프로젝트에 넣기 의존성 관리 툴을 통해 프로젝트에 다운로드 받기 각각 장단점이 있지만, 3rd party 라이브러리 같은 경우에는 의존성 관리 툴을 이용하는 것이 바람직하다. 이번 포스팅에서는 의존선 관리 툴 중 npm을 사용하여 스프링부트 프로젝트 내에서 FrontEnd 라이브러리를 관리하는 방법을 알아본다. 목차 npm 설치 라이브러리 의존성 추가 및 다운로드 gradle 빌드 시 라이브러리 자동 설치하기 npm 설치 npm은 자바스크립트 런타임 환경인 node.js의 기본 패키지 관리자이다. 따라서 npm을 설치하기 위해서는 node.js를..
개요 클라이언트는 서버에게 요청을 하여 원하는 자원을 얻어낸다. 사람들은 저마다 자주 사용하는 웹 사이트가 있고, 그것은 같은 요청을 자주 서버에게 보내는 것과 같다. 내가 원하는 자원은 매번 같은데 꼭 서버로 부터 매번 받아야 할까? 웹 브라우저에서는 캐시 저장소가 존재하여 요청에 대한 응답을 저장해 놓고 사용할 수 있다. 이번 포스팅에서는 그 기술인 Cache의 개념을 배우고 Cache가 관리되는 과정을 적어보려한다. 목차 Cache Last-Modified ETag 프록시 캐시 서버 Cache-Control 완전한 캐시 무효화 Cache 여기서 Cache란, 서버로부터 받은 응답을 저장하는 것을 말한다. 서버와 클라이언트 사이의 통신은 네트워크를 타기 때문에 메모리, 디스크에서 자원을 가져오는 것보..