분류 전체보기
-
상속보다 구성을 이용한 재사용 [1편]실무에서 배운 내용 정리 2018. 12. 21. 05:24
상속보다 구성을 이용하자 => 장점 : 클래스 수를 줄일 수 있음 => 주니어, 시니어 별로 연봉을 계산해주는 연봉 계산기가 있다. 그런데 여기에는 문제가 하나 존재한다. 만약 중간 급을 위한 연봉 계산기가 추가된다면 클래스 수가 증가하기 때문이다.이것은 자바에서 상속을 사용하면 어쩔 수 없이 발생하는 부분이다. 클래스 다이어그램은 다음과 같다. 그럼 직급이 추가될 때마다 클래스 수가 증가하는 부분은 어쩔 수 없는 부분일까?=> 결론부터 말하면, 해결할 수 있다. [2편을 기대해주세요.] 그 전에 왜 이러한 구조가 나왔냐하면, => API를 사용하는 쪽에서는 AbstractSalaryCalculator#public int paySalary(int career)만 사용하면 연봉을 계산해주도록 만들고 싶었기..
-
실행 계획실무에서 배운 내용 정리 2018. 12. 19. 00:20
실행 계획 DB의 두뇌라고 할 수 있는 옵티마이저가 해당 쿼리를 수행할 때, 수행되는 일련의 동작 순서를 트리 형식으로 보여줌 => 이를 통해 쿼리문의 성능을 짐작할 수 있음 특징1. 실제로 실행되는 것이 아니라, 어떻게 실행 되는지를 보여줌2. 실행 계획은 완벽하지 않음 => 따라서 실행 계획을 볼 줄 알아야하고 변경할 줄 알아야함3. 실행계획은 다음과 같은 정보를 포함하고 있음1) 쿼리문이 참조한 테이블들의 순서2) 쿼리문이 참조한 테이블들의 접근방법(ACESS PATH)3) 조인에 의해 영향받는 테이블들의 조인방법(JOIN MEHTOD)4) 데이터 조작방법(filter, sort, or aggregation,etc)4. 실행계획은 개발자가 다음과 같은 피해야하는 항목(=나쁜 냄새)들을 미리 파악할 ..
-
Clustered Index & Non-Clustered Index 차이실무에서 배운 내용 정리 2018. 12. 17. 23:31
인덱스 종류에는 2가지가 있다. 1. Clustered 인덱스2. Non-Clustered 인덱스 Clustered 인덱스란1. 테이블의 데이터를 지정된 컬럼에 대해 물리적으로 재배열=> 데이터 삽입, 수정, 삭제시 테이블의 데이터를 정렬 시킴2. 테이블 당 한개만 존재3. 테이블에서 인덱스를 걸면 가장 효율적일거 같은 컬럼을 Clustered 인덱스로 지정4. 테이블에 데이터가 많이 저장된 상태에서 ALTER를 통해 Clustered 인덱스를 추가한다면, 많은 데이터를 정렬해야 해서 많은 리소스를 차지하게 됨따라서 사용자가 많은 시간에는 함부로 Clustered 인덱스를 추가하면 안된다. 책으로 비유하자면 페이지를 알고 있어서 바로 해당 페이지를 펼치는 것과 같음 Non-Clustered 인덱스란1. ..
-
프록시 객체를 만드는 2가지 방법실무에서 배운 내용 정리 2018. 12. 12. 23:59
스프링에서는 클래스가 인터페이스를 구현했다면 다이내믹 프록시 기술로 프록시 객체를 만들고, 인터페이스를 구현하지 않았다면 CGLIB 기술을 이용해서 프록시 객체를 생성한다. 프록시 객체를 만드는 2가지 방법1. 클래스에 인터페이스를 구현한 경우 => '다이내믹 프록시' 기술을 사용 (자바의 리플렉션 이용)2. 클래스에 인터페이스를 구현 안한 경우 => 'CGLIB' 기술을 사용 (바이트 코드 조작) 하지만 프록시 객체를 만들 때 CGLIB을 사용하게 되면 아래 2가지 제약사항이 생기게 된다. 1. @Bean 메서드에 final을 붙이면 안된다.2. 클래스에 final을 붙이면 안된다. 위의 제약 사항을 지키지 않는다면, 에러가 발생한다. 하지만 다이내믹 프록시를 사용할 경우에는 final을 붙여도 상관없..
-
잘못된 URI 접근 시, 커스텀 에러 페이지로 이동스터디 2018. 9. 4. 19:41
이번 포스팅은 사용자가 잘못된 URI를 입력했을 때, 커스텀 에러 페이지로 가게 하는 방법에 대해 알아보겠습니다. 아래는 프로젝트 진행시 요구사항이었습니다. 주목해서 볼 부분은 세 번째 항목인 스프링 시큐리티를 사용하지 못하도록 한 부분입니다. 스프링 시큐리티를 사용하지 않고, 잘못된 URI 입력했을 때 커스텀 에러 페이지로 가게 하는 가장 쉬운 방법은 인터셉터에서 요청 URI를 검사하여 허용하지 않은 URI일 경우 에러 페이지로 리다이렉트해주는 것입니다. 그래서 아래와 같이, 허용된 URI를 직접 관리해서 이것 이외의 URI가 요청될 경우 에러페이지로 리다이렉트 하는 식으로 구현했습니다. 하지만 이러한 방법에는 몇가지 문제가 있다고 생각했습니다. 첫 번째로, URI가 새로 추가 될 때마다, 매번 URI..
-
XSS 공격에 대한 방어스터디 2018. 9. 4. 16:04
프로젝트를 진행하며 XSS(Cross Site Scripting) 공격에 대한 방어를 하기 위해 네이버에서 개발한 Lucy-Xss-Servlet-Filter 라이브러리를 사용했습니다. 해당 라이브러리는 웹어플리케이션으로 들어오는 모든 요청 파라미터에 대해 기본적으로 XSS 방어 필터링을 수행합니다. 하지만 Lucy-Xss-Servlet-Filter 라이브러리는 form-data에 대해서만 적용되고 JSON에 대해서는 처리해주지 않는다는 단점이 있습니다. 이를 위해 별도로 Request Body로 넘어오는 JSON에 대한 필터를 등록해줬습니다. (마지막 부분에는 Lucy-Xss-Servlet-Filter를 사용하지않고 XSS 공격을 방어하는 법을 소개하겠습니다.) Lucy-Xss-Servlet-Filter..
-
웹소켓카테고리 없음 2018. 8. 20. 02:32
용어 WebSocketHTTP 에서 양방향 통신을 제공하는 프로토콜 (실시간으로 통신이 가능) STOMP Simple (or Streaming) Text Oriented Message Protocol 폴링 방식 주기적으로 계속해서 확인 메세지 브로커ex. RabbitMQ, ActiveMQ etc... 토픽URI 와 유사한 개념자신이 받고자 하는 주제를 정의하면 그것에 해당하는 메시지를 수신 했을 때 처리하는 것 서버 설정@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { // 메세지 브로커 설정 @Override public void confi..
-
자바 ORM 표준 JPA카테고리 없음 2018. 8. 12. 22:01
ORM(Object Relational Mapping) : 객체와 RDB를 매핑시킨다는 개념 JPA(Java Persistence API) : ORM 개념을 자바에서 구현하기 위한 스펙(표준) 영속성 컨텍스트1. 비영속 : 영속성 컨텍스트와 전혀 관계가 없는상태 (아직 저장되지 않아서)2. 영속3. 준영속 : 엔티티가 영속성 컨텍스트에 저장되어있다가 분리, 영속성 컨텍스트가 더이상 관리하지 않는 상태4. 삭제 영속성 컨텍스트 장점 1. 1차 캐시2. 동일성 보장 (쉽게 말해 싱글턴)영속성 상태의 엔티티는 고유한 식별 값(ID)으로 구분되는데 같은 식별 값을 가지는 모든 엔티티는 동일3. 트랜잭션을 지원하는 쓰기 지연 4. 변경감지5. 지연 로딩 동작 방식1. 1차 캐시에 엔티티를 저장2. 쓰기 지연 SQ..