서비스 논리 흐름 타 서비스에서 최저가 서비스 호출 (input: keyword) keyword: {prodGrpId,,, }를 조회 Redis에 없다면 Elasticsearch에서 조회하여 prodGrpId 조회 (상위10건) 후 Redis에 저장 prodGrpId: [{prodId, price}, {} ---] 데이터 조회 없다면 Elasticsearch에서 ProdId별 가격조회 후 반환 반환 후 Redis에 ProdId: Price 정보저장 Redis 설치 인스턴스는 AWS EC2 프리티어로 생성할 수 있는 인스턴스를 생성했다. ubuntu이미지이기 때문에 apt-get install redis-server를 통해 레디스를 설치할 수 있다. 기본적으로 6379포트로 설정되어 있다. /etc/red..
Backend
여기가 매우 잘 정리되어 있어서 주소를 첨부함. https://devel-repository.tistory.com/50 spring boot 로그백 (logback) 설정 방법 logback은 log4j 프로젝트의 후속 버전으로 log4j 1.x가 중단된 이후 버전을 이어받아 발전시켜 왔다. spring boot는 기본적으로 logback 로깅 시스템을 채택하여 제공한다. logback-spring.xml 작성을 통해서 logb devel-repository.tistory.com 에러 로그만 분리하는 방법에 대한 더 쉬운 설명 https://cl8d.tistory.com/96 [Spring] 에러 로깅하기 - Logback을 사용해서 ERROR 레벨만 파일로 로그를 남겨보자! 🌱 들어가기 전 이번 장바구..
OpenFeign이란? https://spring.io/projects/spring-cloud-openfeign 선언형 REST 클라이언트라고 한다. 보통 스프링에서 다른 서버와 REST 통신을 하고 싶을 땐 RestTemplate이나 WebClient 같은 걸 많이 쓴다. OpenFeign을 사용하면 인터페이스 형태로 RestController 작성하듯이 편하게 REST 통신을 위한 코드를 작성할 수 있다. 그리고 MSA 환경에서 각 FeignClient의 이름을 지정해 사용함으로써 각 서비스 간의 통신을 편하게 할 수 있다는 장점도 있다. 예제 레포 주소 https://github.com/purewater02/Feign 의존성 추가 Spring Initializer를 사용해서 spring-cloud-..
@Async가 동작하기 위해서는 먼저 AsyncConfig를 만들어주어야 한다. @Configuration @EnableAsync public class AsyncConfig { } 비동기로 동작하게 하기 위해 커스텀 쓰레드풀을 만들어 주어야 한다. 기본 쓰레드와, 메세징을 위한 쓰레드를 빈으로 등록하고 각각 이름을 붙여준다. @Configuration public class AppConfig { @Bean(name = "defaultTaskExecutor") public ThreadPoolTaskExecutor defaultTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePool..
배치란? 큰 단위의 작업을 일괄 처리 대부분 처리량이 많고 비 실시간성 처리에 사용 대용량 데이터 계산, 정산, 통계, 데이터베이스 변환 등 컴퓨터 자원을 최대로 활용 자원 사용이 낮은 시간대에 배치를 돌리기 배치만 처리하기 위해 사용자가 사용하지 않는 또다른 컴퓨터 자원을 사용 사용자 상호작으로 실행되기 보다는 스케쥴러와 같은 시스템에 의해 실행되는 편. 오전 00시마다 특정 배치 실행, 특정 요일마다 실행 등
필터 클라이언트로부터 오는 요청/응답에 대해 '최초'/'최종' 단계에 위치한다. Spring Context가 아닌 Web Application에서 관리한다. 유일하게 ServletRequest, ServletResponse 객체를 변환할 수 있다. 인증과 관련된 로직을 필터에서 처리하는 게 보통이다. request/response 관련 로깅 로직도 여기 넣는 편이다. 로깅 찍을 때 ContentCachingRequest/responseWrapper 로 받아서 찍으면 stream 관련 에러를 피할 수 있다. 대신 내부 로직 떄문에 실제로 찍을 때 doFilter보다 나중에 찍어야 한다. 특정 컨트롤러에만 필터를 걸고 싶을 때는 @WebFilter 어노테이션을 사용하는 방법이 있다. 인터셉터 필터와 유사하게..
싱글톤 패턴 어떤 클래스가 유일하게 1개만 존재해야 할 때 사용. 예를 들어 어떤 프리터기에 여러 대의 컴퓨터가 접속해야 사용하는 것과 비슷한 논리이다. 소켓 통신을 위한 socketClient를 싱글톤 패턴으로 생성하는 예시 내 경험으로는 보통 Util 클래스 들을 싱글톤으로 만들었다. 주소를 주면 지역을 추출해 주는 유틸클래스 같은 것. 어댑터 패턴 서로 호환이 안되는 인터페이스를 호환되도록 만들어주는 장치 예를 들어 110V, 220V 인터페이스가 있을 때 어떤 기계가 둘 다 이용할 수 있도록 해주는 돼지코 같은 개념이다. DDD 패턴으로 도메인별로 모듈을 쪼개서 개발했는데, 이 도메인들을 다 호출할 수 있는 Core 모듈에서 실제 도메인 내부의 메서드를 호출해서 쓸 때 어댑터를 사용했던 경험이 있..
Thread? process: 프로그램이 실행되면 OS로부터 메모리를 할당받아 프로세스 상태가 됨. thread: 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread임. Multi-threading 여러 스레드가 동시에 수행되는 프로그래밍. 스레드는 각각 자신만의 작업 공간을 가짐 (context) 각 스레드 사이에서 공유하는 자원이 있을 수 있음 (static instance) 여러 thread가 자원을 공유하여 작업이 수행되는 경우, race condition이 발생할 수 있음. 이렇게 여러 쓰레드가 공유하는 자원 중 경쟁이 발생하는 부분을 critical section이라고 부름. critical section에 대한 동기화를 구현하지 않으면 오류가 ..