728x90

분류 전체보기 61

Concurrent Hash Map과 HashMap, HashTable, Synchronized Hash Map

ConcurrentHashMap의 등장 배경 Map 인터페이스의 구현체로는 HashMap, HashTable, ConcurrentHashMap 등이 있다. Map 인터페이스를 구현하면, 형태를 띈다. 이 중, ConcurrentHashMap은 Java 1.5 버전에서 HashTable의 대안으로 처음 소개된 Collection이다. 이전까지는, 멀티 스레드 환경에서 Thread-safe하게 Map을 사용하려면, 해당하는 메소드 혹은 해당하는 코드 블럭을 Lock으로 감싸거나 HashTable을 사용하거나 SynchronizedMap을 사용하거나 해야했다. 하지만 위 방법에는 문제가 있다. HashTable, SynchronizedMap을 동기화 시키기 위해 락을 걸면, 특정 엔트리에만 락을 거는 것이 아..

Java & Spring 2023.05.30

Interceptor

2023.05.16 - [Java & Spring] - Filter 지난번에 정리한 Filter에 이어 Interceptor를 정리하였다. Interceptor Interceptor 인터셉터 Interceptor는 위의 이미지 처럼, Spring Context 영역에서 실행되는, Spring이 제공하는 기술이다. 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다. Filter 이후에, Spring Context 영역에서 실행되는 Dispatcher Servlet은 요청에 따른 컨트롤러를 매칭시키위해, 핸들러 매핑을 수행하고 HandlerExecutionChain을 리턴한다. FilterChain이 각 필터를 순서에 따라 다 거친 뒤에 서블릿을 호출한 것 처럼, Han..

Java & Spring 2023.05.23

Filter

Filter 필터 필터는 Dispatcher Servlet에 요청이 전달되기 전, 요청이 처리된 후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공한다. 필터는 Web Context에서, 즉 톰캣과 같은 웹 컨테이너(서블릿 컨테이너)에서 관리가 된다. Dispatcher Servlet이 존재하는 Spring Context 즉 스프링 컨테이너에서 관리되지 않는다. 단, 스프링 빈으로 등록은 된다. 이유는 하단에서 다룬다. 필터는 아래와 같은 기능을 수행하기 좋다. 로그인여부나 권한 검사와 같은 인증 기능 요청이나 응답에 대한 로그(기록) 기능 오류 처리 기능 데이터 압축이나 변환 기능 인코딩 처리 기능 필터를 사용하려면, Filter 인터페이스를 구현해야한다. ( imple..

Java & Spring 2023.05.16

이펙티브 자바 - 아이템 22 : 인터페이스는 타입을 정의하는 용도로만 사용하라

인터페이스의 용도 클래스가 어떠한 인터페이스를 구현한다는 것은, 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 위반 사례 : 상수 인터페이스 상수 인터페이스란, 메소드 없이, static final 필드로만, 즉 상수로만 구성된 인터페이스를 일컫는다. 아래는 상수 인터페이스의 예다. public interface PhysicalConstancs { // 아보가드로 수 static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자의 질량 static final double ELECTRON_MASS = 9.10..

카테고리 없음 2023.05.08

이펙티브 자바 - 아이템 21: 인터페이스는 구현하는 쪽을 생각해 설계하라

Default Method 자바8에서, 기존의 구현체를 깨뜨리지 않고, 비교적 안전하게 인터페이스에 메소드를 추가하는 방법 기존에는 메서드 하나를 추가하려면 해당 인터페이스를 구현하는 모든 클래스에서는 해당 메서드를 모두 구현해줘야 했다. 하지만, 디폴트 메서드를 이용하면 인터페이스의 기분 구현을 그대로 상속하므로 인터페이스에 자유롭게 새로운 메서드를 추가할 수 있게 된다. 호환성을 유지하면서 API를 바꿀 수 있는 것이다. java8의 java.util.Collection 인터페이스 java7의 Collection 인터페이스는 원래 removeIf 메소드가 없었다. Collection (Java Platform SE 7 ) Collection (Java Platform SE 7 ) Compares th..

Java & Spring 2023.05.08

외래키 제거 고민하기

아래는 이 게시글에 관련된 우리 프로젝트의 이슈이다. Category 테이블의 User 외래키 제약 제거를 통한 의존성 제거 · Issue #121 · YAPP-Github/21st-ALL-Rounder-Team https://github.com/YAPP-Github/21st-ALL-Rounder-Team-2-BE/blob/develop/src/main/java/com/yapp/artie/global/deprecated/LoadUserJpaEntityApi.java LoadUserJpaEntity.java는 UserJpaEntity를 로드하는 API를 수행하는... github.com 현재 우리 프로젝트의 ERD는 아래와 같다. 현재 프로젝트에서 사용하고 있는 JPA 엔티티는 아래와 같은 구조를 가진다...

Spring AOP - Proxy, Dynamic Proxy

아래의 이전 게시글에서, Spring AOP에 관한 기본 개념을 정리하였다. 이번 글은 Spring AOP 중 프록시 패턴을 적용한 경우와 프록시에 대해 정리하였다. Spring AOP - AOP 기본 Spring AOP - AOP 기본 개념 Spring AOP - 1편 AOP는 여러 오브젝트에 나타나는 공통적인 부가 기능을 모듈화하여 재사용하는 기법이다. SRP에 따르면, 클래스를 변경하는 이유은 하나다. 만약, 어떤 로그인 서비스의 수행시간을 magenta-ming.tistory.com 프록시 패턴을 통해 AOP 적용하기 프록시 패턴 ( 런타임 위빙 ) 런타임 시에 프록시를 통해 부가 기능이 적용되는 방식 구체적인 방식 스프링 애플리케이션 컨텍스트가 생성될 때, 타겟과 같은 인터페이스를 구현하는 프록..

Java & Spring 2023.05.03

이펙티브 자바 - 아이템 18 : 상속보다는 컴포지션을 사용하라

상속은 캡슐화를 위반할 수 있다 캡슐화 : 객체의 상태와 행동을 하나의 단위로 묶고, 외부에는 상태를 감추고 행동만을 노출시키는 것 상속을 통해 메소드 재정의를 수행할 수 있는데, 이는 캡슐화를 해칠수 있다. 릴리스마다 내부 구현이 달라질 수 있는 상위 클래스로 인해 하위 클래스가 오동작 할 수 있기 때문이다. 따라서 이미 구현된 class의 상속을 지양하고, implement 상속을 사용하는 것이 좋다. 하위 클래스의 오작동 : self-use 패턴을 사용했을 때 자기 사용 self-use : 자신의 다른 부분을 사용하는 것 / 한 메소드가 같은 클래스 내의 다른 메서드를 사용하는 패턴 public class InstrumentedHashSet extends HashSet { private int ad..

Java & Spring 2023.04.24

아르티(Artie) 프로젝트 리팩토링 - Notice 도메인 리팩토링(1)

User 도메인 리팩토링 리뷰를 끝내고, Notice 도메인의 리팩토링을 진행해야한다. 1. 컨트롤러 분리 각 UseCase에 따라 컨트롤러를 분리하여 Apdater.in.web 패키지에 분류하였다. 2. Dto 이동, 네이밍 변경 Notice 도메인에서는 dto 패키지의 NoticeDetailInfo 클래스를 DTO로 사용한다. 해당 클래스를 GetNoticeDetailResponse 으로 변경하였다. 또한, port.in 패키지 안으로 이동시켰다. 3. GetNoticeDetailResponse의 생성자, 필드 속성 개선 해당 클래스는 NoArgsContructor 롬복 어노테이션으로 기본 생성자를 가지도록 설계되어있다. 그리고, 클래스 내부에 어노테이션 없이 코드로, 모든 필드를 받는 생성자가 선언..

Spring AOP - AOP 기본 개념

Spring AOP - 1편 AOP는 여러 오브젝트에 나타나는 공통적인 부가 기능을 모듈화하여 재사용하는 기법이다. SRP에 따르면, 클래스를 변경하는 이유은 하나다. 만약, 어떤 로그인 서비스의 수행시간을 측정하기 위해 측정 로직은 서비스 내에 넣는다면, 서비스 로직 말고 부가 기능이 비즈니스 로직을 위한 서비스 코드에 포함된다. 맞는 접근일까? 수행시간을 측정하고, 트랜잭션을 처리하고, 권한을 체크하는 등의 부가 기능 작업은 모두 일종의 인프라 로직이다. 인프라 로직 어플리케이션의 전 영역에서 나타날 수 있다. 중복 코드를 만들어낼 가능성 때문에 유지보수가 힘들어진다. 비즈니스 로직과 섞여 있으면, 비즈니스 로직을 이해하기가 어려워진다. 인프라 로직은 각자의 관심사가 있다. 인프라 로직의 중복이 횡단..

Java & Spring 2023.04.19
728x90