Trouble Shooting (14) 썸네일형 리스트형 복합 인덱스 적용기 이번 블로그에서는 개인 프로젝트에 복합 인덱스를 적용해보면서 느끼는 고찰에 대해 기록해보려고 한다. 배경 회원 엔터티가 프로젝트내의 존재한다. 구성은 userId, userPwd, userName, userNumber, userAddress, userEmail 이 존재하고 upadatedDate, createdDate 가 부수적으로 존재한다. 검색 API를 구성했다. - 동적 쿼리로 구성 기본적으로 동적 쿼리로 구성해 조건에 있으면 해당 조건을 넣어 검색하고 없으면 해당 조건을 빼고 검색했다. 예를 들어, 이름과 주소로만 검색 가능하고 모든 조건을 넣어서도 검색이 가능하다. 또한, 동적 쿼리 구성시 BooleanExpression을 각 필드마다 null여부를 체크해서 반환해주는 메서드를 모두 만들고 좀 .. JWT - 공격자 방어 with Access Token, Refresh Token 백엔드를 개발하다 보면 사용자 인증/인가로 JWT를 많이 사용할 것이다. JWT를 사용하면 기본적으로 서버가 클라이언트의 상태를 보존하지 않는다 (stateless 하다). 즉, 매번 서버의 리소스를 접근하기 위해 access를 던질 때마다 해당 유저가 유저 본인인지 공격자인지 구별하지 못한다. 따라서, 이런 문제를 해결하는 방안으로 리플래시 토큰을 추가적으로 사용한다. 이 토큰의 용도는 사용자 인증이 아닌 새로운 엑세스 토큰을 추가적으로 생성하는 용도로만 사용된다. 엑세스 토큰 : 서버의 자원에 접근하기 위한 토큰 리플래시 토큰 : 엑세스 토큰을 발급하기 위한 토큰 엑세스 토큰 탈취, 리플래시 토큰 없음 이를 활용해, 아래와 같은 원리로 공격자 방어를 수행한다. 1. 엑세스 토큰의 유효기간은 가능한 짧.. Effective JAVA를 Spring 프로젝트에 적용해보자 (Item 10~14) 해당 블로그는 Object의 final이 아닌 메서드 equals, hashcode, toString, clone, finalize에 대한 내용으로 모두 재정의를 염두해 두고 설계된 메서드들이기에 활용 방법에 대해 설명한다. Item 10 : equals는 일반 규약을 지켜 정의하라. 기본적으로 equals는 자기 자신 즉, 인스턴스와 비교하기에 재정의를 통해 필드가 같은지 등을 확인할 수 있다. equals 재정의에 대한 경우 객체 식별성이 아닌, 논리적 동치성을 검사하는데 상위 클래스에서 재정의 되지 않은 경우 값 클래스의 경우 Map의 키와 Set의 원소로 활용되는 경우 싱글턴 객체의 경우는 정의가 필요없다. equals 재정의 규약 반사성 : 같은 인스턴스는 같다. 대칭성 : x.equals(y).. Effective JAVA를 Spring 프로젝트에 적용해보자 (Item 6~9) Item 6 : 불필요한 객체 생성을 피하라 기본적으로 자바에서 객체의 낭비를 피하는 것이 일반적이다. 가장 큰 예시가 String이다. 생성자를 통해 객체를 생성하지 않는 이상 같은 문자 리터럴에 대해서 같은 머신에 대해 같은 객체를 사용한다. 사용하는 경우는 다음과 같다. 1. 불변 객체 (예 : String) 2. 불변 객체가 아니더라도 프로그램 도중 변경되지 않을 객체 3. 어댑터 (예 : Map의 keySet) Spring에 적용 그렇다면 Spring 프로젝트에는 어떻게 적용이 가능할까? 첫번째 예시인 불변객체는 기본적으로 해당 객체가 불변객체인지 아닌지 확인 후 그대로 사용하면 된다. 또한 세번째 예시도 마찬가지로 적용이 가능하다. 두번째 예시인 프로그램 도중 변경되지 않을 객체가 프로그램 중.. Effective JAVA를 Spring 프로젝트에 적용해보자 (Item 1~5) Item1 : 생성자보다 정적 팩터리 메서드 사용을 고려하자. 기본적으로 spring에서 클래스에 대한 인스턴스 생성경우는 여러가지가 존재한다. - Controller, Service, DAO 등 기본적인 베이스 클래스에 대한 생성 => Spring에서는 해당 클래스의 인스턴스 생성을 관리해준다. 따라서 인스턴스 생성에 대해 많은 부분을 고려할 필요가 없다. - DTO, Entity 등 클래스 => 클라이언트에 요청에 맞게 생성하는 경우에는 사용이 불필요하다. (통신에서 기본생성자와 getter/setter를 통해 인스턴슬 생성하기에 생성자 생략이 어렵다.) => 개발자가 프로그램 중간에 임의로 인스턴스를 생성하는 경우에 사용한다. 적용 사례 MemberDTO : 회원가입 관련 DTO public cla.. 배포과정 : SpringBoot + Docker + Amazon EC2 목적 하나의 애플리케이션을 제작해보았고 이를 배포하는 과정을 기록해보려고 한다. 초기 과정을 기록해두는 것으로 나중에 방법을 개선하는 방향으로 나아가 보려고 한다. 과정 1. SpringBoot 프로젝트 제작 2. Dockerfile 작성 3. Git Repository 생성 및 push 4. Amazon EC2를 ubuntu 운영체제 이용해 컴퓨터 대여 5. 대여한 컴퓨터에 리눅스 접속 6. 대여한 컴퓨터에 깃 코드 Clone 7. 자바, 도커, Maven 설치 8. 기존의 작성한 Dockerfile을 이용해 해당 파일 빌드 및 이미지 생성 9. 컨테이너 실행 및 서버 연결 1. SpringBoot 프로젝트 제작 기존의 프로젝트를 이용해 이를 배포하려고 한다. 구성은 아래와 같다. Springboot .. 어떤 부분에 대해 테스트 코드를 작성할 것인가? 이 블로그는 제작중인 프로젝트에 대해서 테스트 코드가 필요한 부분과 필요하지 않은 부분에 대한 고찰을 정리한 블로그입니다. 1. 패키지 목록 - 여기서 어떤 패키지는 테스트 코드를 작성하고 어떤 패키지는 테스트 코드를 작성안해도 될까라는 고민이 들었습니다. - 기본적으로 Controller, Service, DAO 패키지에 대한 내용은 Unit Test를 작성을 해야합니다. - Config, utils, interceptor, exception 패키지에 대해서도 Unit Test와 통합테스트를 통해 테스트 코드 작성이 필요합니다. - 다만, 저는 Query DSL을 사용중이라 QClass가 존재하고 data에서는 lombok을 사용하고 있습니다. 하지만 이 코드들은 테스트 코드의 필요성을 느끼지 못했습니.. Indexing 적용해 성능 개선 이번 블로그에서는 인덱싱을 적용해 성능개선을 시도하면서 느꼈던 고찰에 대해서 정리하고자 한다. 1. 배경 API : 전체 회원에서 특정 조건에 맞게 회원을 검색하고자 한다. DATA : 10000개의 회원이 DB에 존재하는 환경이다. DB : MySql 2. 클러스터형 인덱스 기본적으로 클러스터형 인덱스는 기본키를 중심으로 설정된다. 특징으로는 해당 테이블은 이 기본키를 기준으로 정렬된다. 따라서 클러스터형 인덱스는 정렬에 영향을 준다. 물리적으로 영향을 준다는 말이다. 아무 설정없이도 기본적으로 테이블 생성시 생성된다. 다른 칼럼으로 클러스터형 인덱스를 설정 가능하지만 보통은 기본키로 설정해두고 세컨더리 인덱스를 사용해 다른 칼럼을 인덱스로 설정하는 것이 일반적이다. 성능 측정 아이디 : a 검색 아이.. 이전 1 2 다음