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

Spring 39

함수 기반 API 설계

함수형 엔드 포인트 Spring Web 의 엔드포인트를 함수형 스타일로 작성할 수 있다. 애노테이션 방식과 함께 사용 가능하다. 애노테이션 방식과 마찬가지로 DispatcherServlet 위에서 동작한다. 불변성을 고려해서 설계된다. 기존의 애노테이션 방식 @RequestMapping("/api") @RestController public class APIPlaceController { @GetMapping("/places") public List getPlaces() { return List.of("place1", "place2"); } @PostMapping("/places") public Boolean createPlace() { return true; } @GetMapping("/places/{..

Spring 2022.03.19

Spring Cache Abstraction

Spring Cache Abstraction 란? 애플리케이션에 "투명하게(transparently)" 캐시를 넣어주는 기능이다. 메소드, 클래스에 적용 가능하다. 캐시 인프라는 스프링 부트 자동 설정으로 세팅되고, 프로퍼티로 관리 가능하다. 캐시가 있건 없건, 시스템의 기대 동작은 동일해야 한다. -> 목표는 성능이다. 설정 아래와 같이 디펜던시를 추가해 준다. implementation 'org.springframwork.boot:spring-boot-starter-cache' 아래와 같이 @EnableCaching 을 붙여준다. @EnableCaching @SpringBootApplication public class ServiceDeskApplication { public static void m..

Spring 2022.03.19

@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

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

프락시 팩토리빈과 @AspectJ

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

Spring 2022.03.11

프로파일과 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

자바코드로 의존관게 주입하기

자바코드로 의존관계 주입 @Configuration public class MovieFactory { @Bean public MovieReader movieReader() { return new CsvMovieReader(); } // 메소드 콜 방식 @Bean public MovieFinder movieFinder() { return new MovieFinder(new movieReader) } // 메소드 파라미터 방식 @Bean public MovieFinder movieFinder(MovieReader movieReader) { return new MovieFinder(movieReader); } } 위와 같이 자바코드로 의존관계를 주입하는 방법은 크게 2가지이다. 첫번째 방법은 메소드 콜 방식이..

Spring 2022.03.10

필터와 인터셉터

필터 필터는 서블릿이 지원하는 수문장과 같다. 공통 관심사를 처리하기 위함이다. 로그인 페이지를 제외한 모든 페이지는 로그인한 사용자만 볼 수 있다. 요청마다 로그인 여부를 체크하는건 굉장히 번거롭고, 변경시 수정사항이 많다. 이러한 경우에 필터를 이용할 수 있다. 필터의 흐름 여기서 말하는 서블릿은 스프링의 디스패처 서블릿으로 생각하면 된다. HTTP 요청 ->WAS-> 필터 -> 서블릿 -> 컨트롤러 필터 제한 필터에서 적절하지 않은 요청이라고 판단하면 거기에서 끝을 낼 수도 있다. -> 로그인 여부를 체크하기에 딱 좋다. HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 //로그인 사용자 HTTP 요청 -> WAS -> 필터(적절하지 않은 요청이라 판단, 서블릿 호출X) //비 로그인..

Spring 2022.02.27