본문 바로가기

Happyer16

(314)
네이버 검색의 서비스 신뢰도 높이기 - SRE 들어가기 전 나는 B2C 서비스는 조그만 회사에서 밖에 경험해 보지 못했다. 그래서 네이버나 카카오와 같은 대기업이 요구하는 신뢰성에 비하면 항상 후한(?) 신뢰성만을 지켜왔다. 그렇기 때문에, 대규모 서비스에서 신뢰성 보장을 위해서 어떠한 노력을 하는지에 대해서는 전혀 알고 있지 않다. 그래서 이번 포스팅을 통해 사이트 신뢰성을 지키기 위해 무엇을 해야하는지 어떠한 점이 어려운지를 정리해 보려한다. ( 네이버 검색 SRE 시스템 블로깅을 참고로.... ) 신뢰성이란? 365일, 24시간 언제나 서비스가 정상적으로 무중단 제공되는 특성 네이버 검색 서비스에 SRE 도입한 계기 예측 할 수 없는 상황 : 지진이 일어나 검색 요청량이 폭증 하는 경우 스케일이 커질수록 새로운 방법론 필요 16년 9월 경주에서..
마이크로서비스 아키텍처 구축 - 7장.테스팅 테스트의 종류 일반적으로 단위테스트 작성과 단위테스트를 통한 자동화 테스팅에는 익숙해져 있다. ( 나는 아직 그것도 부족하지만... ) 하지만, 분산 시스템 영역에서의 테스트를 어떻게 해야할까? 마이크로서비스에서의 테스팅은 광범위한 분야를 다룬다. 단위 테스팅 : 좁은 범위의 단위 테스트 속성(성능) 테스팅 : nGrinder와 같은 성능 테스트 인수 테스팅 : 넓은 범위의 end to end 테스트 탐색 테스팅 : 고객에 의한 최종 테스팅 테스트를 작성하다 보면 자동화 테스트의 경우 얼마나 많이 작성해야 할지 모호할 때가 있다. 단위테스트야 커버리지 100% 가져가면 좋지만, 통합테스트는 얼마나 짜야할지 모호한 경우가 많다. 테스트의 범위 아래 쇼핑물을 예제로 테스트 종류를 살펴보자. 1. 단위 테스트..
Spring Boot Test 종합 정리 ( 테스트종류, JUnit5 ) 개요 테스트코드의 중요성은 해당 블로그를 읽는 분이라면 모두 알고 있을 것이다. 나도 잘 알고 있지만, 정확한 사용법을 몰라 매번 @SpringBootTest 통합테스트로만 테스트코드를 작성하였다. 이렇게만 작성하면, 테스트코드 속도가 느려지면서 테스트 코드를 사용하지 않게 될 것이다. 그렇기 때문에 상황에 맞는 최소한의 사이즈로 테스트를 하는게 좋다고 생각한다. 해당 포스팅에서 테스트 코드 작성법과 JUnit5에 추가된 내용들을 정리해보려한다! ( 테스트코드 작성방법은 뭔가 매번 까먹었다... ) 1. 통합 테스트 - @SpringBootTest 모든 빈을 등록하여 테스트를 진행한다. 그렇기 때문에 애플리케이션 규모가 크면 테스트가 많이 느려진다. ( 현업에서 테스트 코드를 돌려보셨다면 공감할거에요ㅠㅠ..
자바8 - 4장.스트림 소개 (Stream) 책을 읽기전에 나는 자바8 스트림 API 사용법만 찾아보고 제대로 된 이해를 하지 않았다. 그래서 책을 읽게 되었고 자세히 알아보려 한다. 자바에서 많이 사용되는 것 중 하나가 컬렉션이다. SQL WHERE 절과 같은 역할을 자바에서 한다면? 커다란 컬렉션을 자바에서 어떻게 효율적으로 처리할까? 1. 스트림이란 무엇인가? 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. List lowCaloricDishesName = menu.stream() .filter(d -> d.getCalories() 변하는 요구사항에..
Spring DeleteAllBy...In 호출시 에러 ( TransactionRequiredException ) 문제 상황 : deleteAllByIdxIn 호출 시 entitymanager가 왜 없을까? JPA OSIV라면 기본적으로 트랜잭션 범위는 서비스 단까지 있을테고, entity manager는 생성됐을 것이다. 그런데 왜 아래와 같은 에러가 났을까?? javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call @Service @AllArgsConstructor public class ItemServiceImpl implements ItemService { private final It..
토비의 스프링 6장(4) - 스프링의 프록시 팩토리 빈 스프링의 프록시 팩토리 빈 이전까지 자바를 이용하여 기존 코드 수정없이 부가기능을 추가해주었다. 이제 스프링에서는 어떠한 방식으로 추가해주는지 살펴보자. ProxyFactoryBean 자바 JDK에서 제공하는 다이나믹 프록시 외에도 편리하게 프록시를 만들 수 있도록 지원해주는 다양한 기능이 있다. 스프링은 프록시 오브젝트를 생성해주는 기술을 추상화한 팩토리 빈을 제공해준다. package com.waug.common.currency.service; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import static org.hamcrest.MatcherAssert.a..
트랜잭션 전파 속성 ( propagation ), 롤백 예외 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다. 트랜잭션 경계의 시작 지점에서 트랜잭션 전파 속성을 참조해서 해당 범위의 트랜잭션을 어떤 식으로 진행시킬지 정할 수 있다. 이렇게 글로만 보면 트랜잭션 전파 속성은 왜 써야하는지 전혀 와닿지 않는다. 항상 필요에 의한 공부를 할 때 진정한 공부가 되는 것 같다. e-커머스 회사를 다니고 있고, 고객 주문 + 주문 내역을 기록해주는 기능을 개발하라고 지시를 받았다! 어떻게 개발할 것인가? 트랜잭션을 어떻게 묶을까? 위의 상황을 분석해보면, 고객 주문은 성공을 했는데 주문 내역이 기록이 되지 않아 롤백된다면??? 이 얼마나 매출을 깍아먹는 개발자인가.... 즉 지금 상황에서 트랜잭션을 어떻게 묶을지 결정할 수 있는 요인은 중요한 일(주..
대용량 트래픽을 감당하기 위한 Spring WebFlux 도입 프로모션 기간이나 이벤트 기간에 유저가 폭발적으로 늘어난다면? 어떻게 처리할것인가? 이런 질문을 받는다면 어떻게 접근할 것인가? DB I/O 를 줄이기 위해 캐시? JPA 쿼리 최적화?? 이렇게만 접근했다면 Spring MVC + RDBMS 개발에만 너무 한정되어 있었다고 생각한다. ( 내 얘기이다... ) 물론 해당 방법으로 접근해도 개선이 되는것은 맞다. Blocking I/O 우리가 가장 일반적으로 프로그래밍하는 모델이다. Application에서 I/O 요청을 하고 끝날때까지 Block 되어 다른 작업을 수행할 수 없다. 하지만 Spring Web Application 개발을 하면 Tomcat이나 Netty가 Multi Thread 기반으로 동작하기 때문에 Block 안된듯이 동작한다. 이렇게 되..
Redis Spring Boot에 설정하기 및 개요 Redis, Cache 는 왜 사용하는걸까? 백앤드 개발을 하다보면 가끔 조회하는 시간 때문에 API 응답이 너무 느릴 때가 있다. 이럴 때 캐시를 사용하면 응답시간이 많이 줄어든 경험이 있을 것이다. ( 인메모리에 올려서 한 경우도 있지만?... ) 그렇다고 무조건 캐시를 사용하면 될까? 남용하게 되면 서비스의 신뢰성이 떨어지는 경우가 발생할 수도 있다. Cache 도입할때 고려사항 - 1. 정보가 잘 변경되지 않는 경우 + 처리 시간이 긴 경우 이를 고려하지 않고 도입을 한다면 데이터가 맞지 않아 서비스의 신뢰성이 떨이지게 된다 Cache 도입할때 고려사항 - 2. 빈번한 동일 요청 빈번하게 동일한 검색 요청을 하게 된다면 Cache 도입을 고려해볼 수 있다. 디스크에서 읽어오는 것 보다 서버의 메모..
JPA 15장. 고급 주제와 성능 최적화 성능 최적화 1 - 읽기 전용 쿼리의 성능 최적화 Entity가 영속성 컨텍스트에 관리되면 다양한 혜택을 얻을 수 있다. 하지만 dirty check를 위해 snapshot 인스턴스를 보관하므로 더 많은 메모리를 사용하는 단점이 있다. 대량의 데이터를 조회만 할거기 때문에 읽기 전용으로 메모리 사용량을 최적화할 수 있다. 1) 읽기 전용 트랜잭션 사용 - 속도 최적화 @Transactional(readOnly=true) 해당 옵션을 주면 Spring Framework가 Hibernate Session의 Flush 모드를 Manual로 설정하여, 강제로 flush()를 하지 않는 한 flush()가 일어나지 않는다. 트랜잭션이 커밋되어도 플러시되지 않음 flush() 할 때 일어나는 스냅샷 비교와 같은 무..