전체 글

전체 글

    [Spring] @ConfigurationProperties를 이용한 yml 설정 파일들의 객체 추상화

    @ConfigurationProperties를 이용한 yml 설정 파일들의 객체 추상화 프로젝트를 진행하면서 구글, 네이버, 카카오 등의 OAuth2를 사용하게 되었다. 우리 팀은 각 서비스의 secret_key 등을 application.yml에 노출하고 싶지 않았다. Jasypt 등으로 암호화도 가능하겠지만 그냥 gitignore를 활용하기로 했다. 다음과 설정파일을 나눴다. 그리고 application.yml 내부에 spring:profiles:include = oath2 를 사용해주었다. profile을 모듈처럼 사용하는 방법이다. profile에 대해서는 **이 링크**를 확인하자. application-oauth2.yml은 profile이 oauth2인 application.yml 이라고 보면..

    [Spring] BindingResult와 Errors의 차이점에 대해

    BindingResult와 Errors의 차이점 에 대해 에러처리를 할 때에 파라미터로 BindingResult와 Errors를 사용할 때가 있다. 이 둘의 차이점은 무엇일까? BindingResult는 인터페이스고, Errors 인터페이스를 상속받고 있다. 실제 넘어오는 구현체는 BeanPropertyBindingResult 인데 BindingResult대신 Errors를 사용해도 된다. Errors 인터페이스는 단순한 오류 저장과 조회 기능을 제공한다. BindingResult는 여기에 더해서 추가적인 기능들을 제공한다. (ex. addError()) REFERENCE https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboar..

    [Spring] HttpMessageConverter가 적용되는 시점에 대해

    HttpMessageConverter가 적용되는 시점에 대해 스프링을 사용할 때에 직렬화와 역직렬화 시에 메세지 컨버터를 사용하게 된다. 먼저 클라이언트의 요청을 반환하는 여러 예시 코드를 살펴보겠다. @Controller public class RequestBodyController { @GetMapping("/response-body-json-v1") public ResponseEntity responseBodyJsonV1() { BepozObject bepozObject = new BepozObject(); bepozObject.setUsername("userA"); bepozObject.setAge(20); return new ResponseEntity(bepozObject, HttpStatus...

    [Spring] Gradle 파일 implementation, api, runtimeOnly, compileOnly... 등에 대해

    Gradle 파일 implementation, api, runtimeOnly, compileOnly ... 등에 대해 아무 생각없이 gradle을 사용해왔는데 우테코 미션에 대한 리뷰 중 다음과 같은 것이 달렸다. 그래서 공부해보았다! 먼저, Classpath에 대해서 알아야 할 것 같다. Classpath는 클래스나 jar 파일이 존재하는 위치라고 볼 수 있다. Classpath는 Compile-time classpath 와 Run-time classpath로 나누어진다. Compile-time classpath는 에러없이 컴파일을 하기위해 필요한 클래스와 jar들의 위치를 나타낸다. 이렇게 컴파일을 하고 난 뒤에 애플리케이션의 실행이 당연히 될 것이라고 생각할 수 있는데 그것은 오산이다. 런타임에서 ..

    [Spring] @Profile, @ActiveProfiles 에 대해

    @Profile, @ActiveProfiles 에 대해 로컬로 애플리케이션을 돌릴 때와 테스트를 돌릴 때 그리고 실제 운영을 하기위한 배포를 할 때, 각기 다른 설정을 주고 싶을 수가 있다. 또는 각 설정에 맞는 빈을 가져와서 사용하고 싶을 수가 있다. 예를 들면, 배포를 할 때에는 실제 실무에서 사용하는 DB에다가 연결하고 싶을 것이고 테스트나 로컬 시에는 인메모리 DB를 사용하고 싶을 수도 있다. 이때, @Profile을 이용하게 된다. 어노테이션을 알아보기 이전에 properties / yml 설정 파일을 살펴보면서 profiles이 무엇인가에 대해 간략히 알아보자. spring: profiles: active: local --- spring: config: activate: on-profile: ..

    [Spring] @ConfigurationProperties 에 대해

    @ConfigurationProperties 에 대해 properties / yml 파일의 값 들을 가져와서 클래스에 바인딩해주는 어노테이션이다. 위는 application.properties 이다. 이것을 다음과 같은 방법으로 가져와서 사용할 수가 있다. @ConfigurationProperteis("account")를 이용해서 값을 바인딩 해주었다. prefix를 반드시 적어줘야 한다. 그리고 반드시 빈 등록이 되어야 하기 때문에 @Configuration을 통해 빈 등록을 해준 것을 볼 수가 있다. @Value("${account.name}")을 주석처리 해놨는데, @ConfigurationProperties를 사용하지 않고 @Value를 이용해서 가져올 수도 있다. 이 방법은 setter를 통한 ..

    [Spring] Mockito.mock() vs @Mock vs @MockBean

    Mockito.mock() vs @Mock vs @MockBean Mockito.mock() @Test public void givenCountMethodMocked_WhenCountInvoked_ThenMockedValueReturned() { UserRepository localMockRepository = Mockito.mock(UserRepository.class); Mockito.when(localMockRepository.count()).thenReturn(111L); long userCount = localMockRepository.count(); Assert.assertEquals(111L, userCount); Mockito.verify(localMockRepository).count()..

    [Spring] CORS와 처리 방법에 대해

    CORS와 처리 방법에 대해 CORS(Cross-Origin Resource Sharing, CORS, 교차 출처 리소스 공유)는 추가 HTTP 헤더를 사용하여, 한 출처(origin)에서 실행 중인 웹 어플리케이션이 다른 출처(corss-origin)의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제를 말한다. 만약 내가 서비스하고 있지 않은 사이트에서 세션을 요청해서 세션을 획득할 수 있다면 해당 사이트는 악의적으로 내 세션을 탈취하거나 다른 행동을 할 수 있기에 브라우저에서는 이러한 요청을 막는다. 이 떄문에 CORS가 필요한 것이다. 여기서 origin이란 특정 페이지에 접근할 때 사용되는 URL의 Schema(프로토콜), host(도메인), 포트를 말한다. 만약 이 3가..