모르지 않다는 것은 아는것과 다르다.

분류 전체보기 224

@ControllerAdvice

ControllerAdvice 란? @ExceptionHandler 를 모아서 글로벌하게 적용할 때 쓰는 애노테이션 종류 @ControllerAdvice @RestControllerAdvice = @ControllerAdvice + @ResponseBody 속성 value == basePackages basePackages: 적용 범위를 문자열을 이용해 특정 패키지로 지정 basePackageClasses: 적용 범위를 대표 클래스 한 개를 이용해 특정 패키지로 지정 basePackages 를 type-safe 하게 사용하기 위해 제공하는 옵션 assignableTypes: 적용 범위를 특정 클래스에 할당할 수 있는 컨트롤러로 지정 annotations: 적용 범위를 특정 애노테이션을 사용한 컨트롤러로 ..

Spring 2022.03.19

설정파일(Properties) 관리

설정파일 우선 순위 JAR 패키지 안의 application.properties, application.yaml JAR 패키지 안의, 프로파일이 지정된 파일: application-{profile}.properties JAR 패키지 밖의 파일 JAR 패키지 밖의, 프로파일이 지정된 파일 경로에 따른 우선 순위 classpath 에 존재하는 파일이 1순위를 가진다. 순위는 아래와 같다. 1.classpath classpath:/ classpath:/config 2.현재 디렉토리 ./ ../config ../config/child 설정파일을 읽는 방법 @value Environment @ConfigurationProperties @Value SpEL 로 프로퍼티명을 표현한다. type-safe 하지 않다. ..

Spring 2022.03.19

ENUM 활용

개요 enum 을 자주 사용했지만, 꼭 필요한 경우와 장점을 확실하게 설명하지 못했다. 그래서 오늘 enum 에 대해서 좀더 자세히 공부하고 정리해 보려고 한다. enum 을 사용하지 않았을 경우와 사용했을 경우를 비교해 보면서 enum 에 대해서 알아보자. 기존 코드 private void validateCreateDeveloperRequest(Developer developer, Integer experienceYears) { if (developer.getDeveloperLevel() == "junior" && experienceYears > 4) { throw new DMakerException(LEVEL_AND_EXPERIENCE_YEARS_NOT_MATCH); } if (developer.ge..

Java 2022.03.14

Null Safety

Null Check 개발을 하다보면, NPE 는 자주 등장하는 에러이다. 그럼 어떻게하면 NPE(Null Pointer Exception) 을 피할 수 있을까? 아래와 같이 Null Check 를 잘 해주면 된다. public void method(String request) { if(request == null) return; System.out.println(request.toUpperCase()); } 위와 같이 null 여부를 체크해주면 NPE 를 피할 수 있다. -> 하지만 개발자가 실수로 null 체크를 하지 않았을 때, 에러의 위치를 정확히 파악하기 힘들 수도 있다. 이러한 문제를 해결하기 위해서는 Spring 에서는 @NonNull, @Nullable 애노테이션을 제공한다. @NonNull..

Spring 2022.03.14

intellij 단축키

Mac Reformat Code : ⌥ + ⌘ + l 프로젝트 창 포커스 : ⌘ + 1 -> ESC 누르면 다시 에디터 창으로 돌아온다. 프로젝트 창 미리보기 : 파일 클릭하고 Space 에디터 창만 남기기 : shift + ⌘ + F12 에디터 창 이동 : ⌃ + tab 새 파일 생성 에디터에서 생성 : ⌃ + option + N 프로젝트 창에서 생성 : ⌘ + N 커서 이동 단어별 이동 : ⌥ + ← → 라인 시작/끝 이동 : fn + ← → 페이지 위/아래 : fn + ↑ ↓ 선택 확장/축소 : ⌥↑, ⌥↓ / ctrl + W, ctrl + shift + W 주석 처리 한 줄 주석 : ⌘ + / 블록 주석 : ⌥ + ⌘ + / 인덴트 : tab 인덴트 취소 : ⇧ + tab 자동 인덴트 : ⌃ + ..

Other 2022.03.14

프락시 팩토리빈과 @AspectJ

프락시 팩토리 빈 스프링의 AOP 모듈은 다양한 프락시 기술을 일관된 방식으로 사용할 수 있도록, 프락시 팩토리 빈이라는 서비스 추상화를 제공하고 있다. 프락시 팩토리빈은 프락시를 생성해서 빈 객체를 등록해 주는 팩토리 빈이다. JDK 동적 프락시와는 달리 프락시 팩토리 빈은 순수하게 프락시를 생성하는 작업만 담당하고, 프락시를 통해 제공할 부가 기능은 별도 객체로 생성해, 스프링 컨테이너에 빈으로 등록해 줄 수 있다. @Primary @Bean public ProxyFactoryBean cachingMovieReaderFactory(ApplicationContext applicationContext) { MovieReader target = applicationContext.getBean(MovieRe..

Spring 2022.03.11

데코레이터 패턴 활용해서 관심사 분리하기

프락시와 데코레이터 패턴 마치 자신이 클라이언트가 사용하려는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아 주는 갳게를 프락시라고 부른다. 프락시를 통해서 최종적으로 요청을 위임받아 처리하는 실제 객체를 타깃 오브젝트 즉, 대상 객체라고 부른다. 프락시의 특징은 대상 객체와 같은 인터페이스를 구현했다는 것과 프락시가 대상 객체를 제어할 수 있는 위치에 있다는 것이다. 프락시는 사용 목적에 따라서 두 가지로 구분할 수 있다. 첫 번째는 대상 객체에 부가 기능을 부여해 주는 목적이다. -> 이는 디자인 패턴에서, 데코레이터 패턴이라고 부른다. 두 번재는 클라이언트가 대상 객체에 접근하는 방법을 제어하는 목저이다. -> 이는 디자인 패턴에서, 프락시 패턴이라고 부른다. 이번 글에서는 캐싱이라는 부가 기..

객체지향 2022.03.10

프로파일과 Resource 인터페이스

프로파일 지정 경우에 따라 다르게 프로파일을 지정하고 싶을 때가 있다. public class MovieProfile { public static final String CSV_MODE = "csv_mode"; public static final String XML_MODE = "xml_mode"; // 생성자 차단 private MovieProfile () {} } 먼저 위와 같이 상수들을 담는 클래스 만들어 준다. 단지 상수만을 담는 용도이기 때문에 생성자를 막아둔다. @Profile(MovieProfile.CSV_MODE) @Repository public class CsvMovieReader { // ... 이하 생략 } @Profile(MovieProfile.CSV_MODE) @Repositor..

Spring 2022.03.10

캐시를 사용한 읽기 속도 최적화

Caffeine 자바 8을 기반으로 개발된 고성능 캐시 라이브러리인 카페인을 사용해 보겠다. 카페인은 자바의 표준 캐싱 API인 JCache 기반이다. 즉, JSR-107과 함께 스프링을 포함해서 다양한 자바 생태계의 프레임워크를 지원하고 있다. implementation 'com.github.ben-manes.caffeine:caffeine:2.8.0' 위와 같이 의존성을 추가해 준다. @Test void useCache() throws InterruptedException { // 캐시를 200ms 동안 유지하고, 최대 100개까지 저장해 둘 수 있는 카페인 캐시 객체 생성하기 Cache cache = Caffeine.newBuilder() .expireAfterWrite(200, TimeUnit.M..

Spring 2022.03.10