Spring (19) 썸네일형 리스트형 스프링의 핵심, IoC/DI, AOP, PSA - PSA편 PSA란?스프링의 핵심 3가지 요소 중 마지막은 PSA입니다.PSA는 Portable Service Abstraction의 줄임말로, 특정 도메인에 대해 일관성 있는 서비스 추상화를 제공함으로써 특정 모듈에 대한 의존도를 낮추어 변경이 용이하도록 하는 장점이 있습니다.대표적인 예시Spring PSA의 대표적으로는 Spring Web, JDBC, TrasactionManager 등이 있는데요.Spring Web: Servlet 의존적인 코드가 아닌 @Controller나 @GetMapping 과 같은 어노테이션 기반의 컨트롤러를 작성할 수 있습니다.JDBC : MySQLJdbcConnection, OracleJdbcConnector등의 구현체가 아닌 JdbcConnector를 통해 DB의 종류에 관계없는 .. 스프링의 핵심, IoC/DI, AOP, PSA - AOP편 Spring AOP란?AOP(ASpect-Oriented Programming)는 횡단 관심사(e.g. 로깅, 트랜잭션, 보안)등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리하는 기법입니다.Spring에서는 Proxy Pattern을 이용하여 AOP를 지원합니다. Proxy Pattern이란?Proxy Pattern은 특정 객체에 대해 접근을 제어하며. 특정 객체로 요청을 보낼 때 Proxy가 이를 가로채 특정 작업을 수행할 수 있도록 하는 기법입니다.(참고)구조를 간단하게 설명드리자면, 실제 객체(이하 Service)의 인터페이스를 구현한 Proxy를 만들어, Proxy가 Service를 참조로 가지고 있어 Client가 operation을 호출하면 Proxy의 operation이 실행되고,.. 스프링의 핵심, IoC/DI, AOP, PSA - IoC/DI 편 제어의 역전, IoC개발자가 개발한 코드가 제어 흐름을 가지고 있지 않고, 외부 제어로부터 호출되어 자신의 일을 하는 것. 즉 프로그램 전체의 제어 권한이 프로그래머에게 있지 않은 것을 Inversion of Control(제어의 역전)이라고 합니다.전통적인 프로그래밍 방식은 개발자의 코드가 라이브러리를 호출하는 방식입니다.제어의 역전이 적용되면 외부 라이브러리 코드가 개발자의 코드를 호출합니다.의존 관계 주입, DI정의프로그램에 속한 객체들은 의존 객체들의 구현체를 직접 생성하지 않고 외부로 부터 주입받아 사용하는 것을 의미합니다.Java에서는 인터페이스를 통해 실제 구현체를 몰라도 실행이 가능하기 때문에 모듈 결합도를 낮추고 변경에 유리합니다.class NoDIClass{ private final B.. 아키텍처 최적화, 비동기 로깅을 통한 공연 정보 조회 API 최적화 하기 개요마지막 글에서 측정 결과 System CPU와 Nginx CPU가 과도하게 사용되는 것을 확인할 수 있었고, 그에 대해 NGINX가 정말로 필요할까? 라는 의문을 내렸고, Disk I/O가 과도하게 발생해 이에 대한 CPU 자원이 많이 사용되는 것이 아닐까? 하는 가설을 세웠습니다.그에 따라 NGINX를 제거하고, 로그 저장 방식을 바꾸어 성능 테스트를 다시 해보기로 결정했습니다.현재 보고 계신 글은 공연 조회 API 최적화 시리즈 입니다!1편 :공연 정보 조회 API 쿼리 분석하고 개선하기2편 :공연 조회 API 성능 측정 및 개선 사안 찾아보기3편 :공연 조회 API에 캐싱을 적용하고 성능 테스트하기4편 :아키텍처 최적화, 로그 방식 변경을 통한 공연 정보 조회 API 최적화 하기그럼 어떤 것이 .. 공연 조회 API에 캐싱을 적용하고 성능 테스트하기 개요이번에는 저번 글에서 병목지점이 Connection Pool의 커넥션 갯수 부족일 것이라 가설을 세웠었는데, 이를 해결하기 위해 API에 캐시를 도입하였습니다.캐시는 이 글에서 이미 개발을 했었는데요, 총 3개의 CacheManager(Local, Global, Composite)을 빈으로 등록했었는데요, 저는 지금은 Spring 인스턴스가 하나이기 때문에 Local Cache만을 적용하여 테스트 하였습니다.@Caching( cacheable = [ Cacheable( cacheManager = CacheConfig.LOCAL_CACHE_MANAGER_NAME, cacheNames = [CacheType.PRODUCT_CACHE_NAME], .. 공연 조회 API 성능 측정 및 개선 사안 찾아보기 개요이번에는 저번 글에서 개선한 API에 대해 RPS가 얼마나 찍히는지, 병목지점은 어디인지 확인해 보는 시간을 갖기로 했습니다.API는 공연의 리스트를 조회하는 페이지로, 테스트는 1~10페이지를 조회하는 것으로 결정하였습니다.성능 테스트는 어떠한 특정 목표를 갖기 보다는, 성능 측정 → 개선 과정을 거치면서 제가 할 수 있는한 최대한의 처리량과 최소한의 응답시간을 갖는 것을 목표로 정했습니다.서버 구조일단 저희가 테스트할 서버의 구조 중, 현재 API에서 사용하는 구조는 다음과 같습니다.여기서 nginx와 Spring은 같은 서버내에 위치하고 있으며 Docker로 구분되어 있습니다. User - Nginx간의 접속은 Https로 연결되며, Nginx - Spring 간의 연결은 http로 변환되어 연.. Spring + ELK로 로그 시스템 구축하기 개요Ticketing 프로젝트 진행 중에 로그를 시각화하기 위해서 ELK 스택을 도입하기로 결정하였습니다. 원래는 모니터링 서버(Grafana)에 Loki와 연동하였으나, 모니터링 서버의 성능이 상대적으로 떨어져 정상적으로 로그를 처리하지 못했고, ElasticSearch도 사용하게 된 김에 이를 해결하기 위해 ELK를 도입하기로 결정했습니다. 1. Spring 로그 설정먼저 ELK로 로그를 보내기 위해선, 스프링에서 찍은 로그를 파일로 저장해야합니다. 로그는 LogstashEncoder를 사용하여 JSON 형태로 로그가 저장되도록 설정하였습니다. ${LOG_PATH}/${LOG_FILE}_${TODAY}.log ${LOG_PATH}/${LOG.. 공연 조회 API에 캐싱 적용하기 개요이전글에서 공연 조회 API에 대해 병목지점을 파악하고, 성능 테스트를 해보았습니다. 이번글에서는 공연 정보 조회 API에 캐시를 적용하여 조회 성능을 더욱 올려보도록 하겠습니다. 캐시를 적용한 이유현재 공연 조회 API는 별도의 검색 기능을 제공하지 않고, 오로지 페이지 네이션 기능만을 제공합니다. 이렇게 사용자에게 보여지는 데이터가 일정하고 변경이 많지 않기 때문에 캐시를 적용하는 것이 적절하다고 판단하였습니다. 구조 설계캐시는 Local Cache, Global Cache(Redis)를 모두 사용할 것인데요, 이렇게 두가지의 캐시를 아래의 전략으로 사용할 예정입니다.Local Cache는 TTL을 짧게 주어 데이터가 자주 변경되게 함.Global Cache는 TTL을 길게 주어 데이터가 오래 .. 이전 1 2 3 다음