분류 전체보기

    [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가..

    [JDBC] 단일 Select을 위한 방법들

    [JDBC] 단일 Select을 위한 방법들 Line id bigint auto_increment not null, name varchar(255) not null unique, color varchar(20) not null, primary key(id) 다음과 같은 Line 테이블이 있다. select * from line where name = ? 다음과 같은 쿼리문의 결과값을 받아오려는 메소드를 만든다고 한다. public Line findLineByName(String name) { String sql = "select * from line where name = ?"; return jdbcTemplate.queryForObject(sql, lineRowMapper(), "1호선"); } pri..

    [Spring] Spring Validation 처리에 대해

    Spring Validation 처리에 대해 지금까지 Validation이거나 연관된 주제에 대한 내용을 여러번 정리했었다. @Valid를 이용한 Exception처리와 ThymeLeaf 처리 Validator 생성 시 주의해야 할 점, Invalid target 오류 ErrorSerializer에 대해 Custom Validator 적용하기 @NotNull, @NotEmpty, @NotBlank 그런데 읽다보니 ResponseEntityHandlerException를 통해서 처리하는 방법, BindingResult, Errors로 처리하는 방법 등 여러 선택사항이 있어 대체 이것들이 뭐길레 방법이 이렇게 있지 헷갈렸다. 그래서 정리해본다. 먼저 다음과 같이 진행해보았다. @NotBlank를 달아주었고 ..

    [Spring] @Transactional 에 대해

    @Transactional 에 대해 트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다. 애플리케이션을 개발하다보면 여러 쿼리를 날려야 하는 로직을 맞닥뜨리게 된다. 만약, 쇼핑몰에서 상품을 구매할 때 잔여 금액이 충분한지 확인하고 잔여 금액이 상품 가격보다 높을 때 구매 로직으로 넘어가야 하고 상품의 재고가 있는지 확인 후에 잔여 금액을 상품 가격만큼 감소시키고 로직을 종료해야 한다고 하자. 그런데 선택상품구매 단계에서 예외가 발생하여 상품이 없음에도 불구하고 있다고 판단하였거나 잔여 금액이 감소하는 찰나에 서버의 전원이 나가서 상품을 구매했는데도 회원의 잔여 금액이 감소하지 않을 수가 있다. 이를 위해 ..

    기타 등등(계속 추가)

    기타 등등 (계속 추가) 당연히 알고있다 생각하지만 흐릿하거나 모르고 지나칠 수 있는 상식들을 적어 두었다. 000001. static 인스턴스를 생성하면 서로 다른 값을 유지하기 때문에 경우에 따라서 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙인다. static이 붙은 멤버변수(클래스 변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문에 인스턴스를 생성하지 않아도 사용할 수 있다. static이 붙은 메서드에서는 인스턴스 변수를 사용할 수 없다. 반대는 가능하다. 메서드의 작업 중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없지만 만약 필요로 하지 않는다면 static을 붙여서 메서드 호출시간을 짧게해줄 수가 있다. static 영역은 G..