Locale DispatcherServlet을 사용하면 클라이언트의 Locale을 사용하여 메시지를 자동으로 확인할 수 있다. 이는 LocalResolver 객체를 사용한다. request가 들어오면 DispatcherServlet이 LocalResolver를 찾아 이를 설정해준다. RequestContext.getLocale()을 사용하면 LocalResolver를 통해 찾아진 Locale을 찾을 수 있다. 또한 특정 상황에 따라 Locale을 변경할 수 있는 Interceptor도 등록 가능하다. AcceptHeaderLocaleContextResolver : 요청 헤더의 accept-launguage 이용 Cookie Resolver @Bean public LocaleResolver localeRe..
String filePath = "/upload"; //파일 업로드 경로 File dir = new File(filePath); if(!dir.isExist()) { dir.mkdirs(); } 절대경로 / 로 디렉터리를 만들어서 파일을 업로드 하려고 할때, mkdirs() 에서 false가 return 됐다. Read-only File System 이라는 오류가 뜬다. 개발을 맥북에서 진행했는데, 맥북 루트 디렉터리에 폴더 생성이 카탈리나 부터 금지가 됐다고 한다. 심볼릭 링크를 만들어서 해결했다. 심볼릭 링크 만드는 법. 1. /etc synthetic.conf 2. upload /Users/... 원하는 경로로 설정 중간은 띄어쓰기가 아닌 탭 출처: https://yonguri.tistory.com..
Spring Boot는 테스트를 위한 다양한 유틸리티와 어노테이션을 제공한다. 테스트 지원을 위한 모듈은 2개가 있다. spring-boot-test는 다양한 코어 항목들이 포함되어 있고 spring-boot-test-autoconfigure는 테스트를 위한 자동구성을 제공한다. 대부분의 개발자는 spring-boot-starter-test("Starter")를 사용한다. "Starter" 에는 다양한 라이브러리들이 포함되어 있다. Junit 5 Spring Test & Spring Boot Test AssertJ Hamcrest Mockito JSONassert JsonPath @SpringBootTest Spring Boot는 Spring ApplicationContext이다, 따라서 테스트하기 위해..
외부 설정 외부설정이란? 하나의 애플리케이션을 여러 환경에서 실행해야 할 때가 있다. 대표적으로 개발자들이 사용하는 개발 환경, 실제 운영 서버와 같은 데이터로 테스트를 진행하는 테스트 서버, 실제 고객에게 서비스하는 운영 환경이 있다. 각각 환경에 따라서 서로 다른 설정값을 사용한다. 각 환경에 같은 코드를 사용하면서 다른 설정을 하기 위한 방법이 외부에서 설정값을 주입해주는 방법이다. 유지보수하기 좋은 애플리케이션 개발의 가장 기본 원칙은 변하는 것과 변하지 않는 것을 분리하는 것이다. 외부 설정을 통해 각 환경에 따라 변하는 외부 설정값은 분리하고, 변하지 않는 코드와 빌드 결과물은 유지했다. 빌드 과정을 줄이고, 환경에 따른 유연성을 확보할 수 있다. 외부설정방법 OS 환경 변수 : OS에서 지원..
프록시 기술의 한계 JDK 동적 프록시와 CGLIB를 사용해서 AOP 프록시를 만드는 방법에는 각각 장단점이 있다. JDK 동적 프록시는 인터페이스가 필수이고, 인터페이스를 기반으로 프록시를 생성한다. CGLIB는 구체 클래스를 기반으로 프록시를 생성한다. 물론 인터페이스가 없고 구체 클래스만 있는 경우에는 CGLIB를 사용해야 한다. 인터페이스가 있는 경우에는 JDK 동적 프록시나 CGLIB 둘중에 하나를 선택할 수 있다. ProxyFactory에 proxyTargetClass 옵션에 따라서 둘중 하나를 선택해서 프록시를 만들 수 있다. proxyTargetClass = false JDK 동적 프록시를 사용해서 인터페이스 기반 프록시 생성 proxyTargetCalss = true [default] C..
김영한님 스프링 고급편 강의를 듣고 정리.. AOP 소개 핵심 기능과 부가 기능 분리 부가기능의 문제점 부가 기능을 적용할 때 아주 많은 반복이 필요하다. 부가 기능이 여러 곳에 퍼져서 중복 코드를 만들어낸다. 부가 기능을 변경할 때 중복 때문에 많은 수정이 필요하다 부가 기능의 적용 대상을 변경할 때 많은 수정이 필요하다. 부가 기능을 핵심 기능에서 분리하고 한 곳에서 관리하도록 했다. 그 부가 기능과 부가 기능을 어디에 적용할 지 선택하는 기능을 합해서 하나의 모듈로 만들었는데, 이를 바로 애스펙트(aspect)이다. 이것이 바로 @Aspect 이다. 그리고 스프링이 제공하는 어드바이저도 어드바이스(부가 기능)과 포인트컷(적용 대상)을 가지고 있어서 개념상 하나의 애스펙트이다. 이렇게 애스펙트를 사용..
김영한님의 강의를 듣고 정리한다. Spring의 Controller, Service.. 등등 대부분의 클래스들은 Spring Container에 Bean으로 등록되어 사용된다. 스프링 빈은 싱글톤으로 등록된다. 이 인스턴스가 애플리케이션에 딱 1개 존재한다는 뜻이다. 이렇게 하나만 있는 인스턴에 전역변수를 선언하여 사용하면 어떤 문제가 발생할까? 해당 빈의 전역변수를 여러개의 쓰레드가 동시에 접근하여 사용하기 때문에 중간에 데이터가 바뀌거나 유실되는 문제가 발생한다. 이를 동시성 문제라고한다. 더보기 이런 동시성 문제는 지역 변수에서는 발생하지 않는다. 지역 변수는 쓰레드마다 각각 다른 메모리 영역이 할당된다. 동시성 문제가 발생하는 곳은 같은 인스턴스의 필드(주로 싱글톤에서 자주 발생), 또는 stat..
1. IoC와 DI IoC(Inversion of Control)은 객체 또는 프로그램의 일부에 대한 제어를 컨테이너 또는 프레임워크로 이전하는 방법이다. IoC는 DI라고도 할 수 있는데, 이 프로세스는 객체가 생성자의 인자, 팩토리 메서드에 대한 인수 또는 객체 인스턴스가 팩토리 메서드로부터 생성되거나 반환된 후 객체 인스턴스에 설정된 속성을 통해서만 객체의 종속성을 정의하는 것이다. 이러한 구조의 장점 구현(implementation)으로 부터 작업 실행의 분리할 수 있다. 서로 다른 구현(implementation)으로 부터 쉽게 전환(switch)할 수 있다. 프로그램의 모듈성 (낮은 결합도) 컴포넌트를 구분하고, 종속성을 쉽게 바꿔가며 테스트를 쉽게 할 수 있다. 더보기 Factory Meth..