결과 : 네트워크 호출 한 번으로 다중 쿼리 결과를 Mybatis Multi ResultSet으로 받아오기 이슈 : 서비스 도중 회원정보 조회가 수 십초가 걸리는 현상이 있었음다. 비록 순간 짧은 시간이었지만, 이로 인해 다른 도메인 서비스에서는 timeout으로 500에러가 발생 원인 : 회원 조회 부분에 여러 쿼리를 비동기 호출로 가져오고 있었음. 모니터링 도구로 확인해 보니 쿼리 호출 자체가 엄청 느린것을 확인할 수 있었음. db connection 하는 도중 tread가 부족하여connection 될 떄 까지 대기하고 있었음. 아무래도 비동기 호출이 2번만 이루어 지더라도 1분에 회원 조회가 10000번 호출되면 필요한 thread수는 많아 질 수 밖에 없음. 조치 : 보통 쿠버네티스 pod이 c..
JPA란 무엇일까? # 개요 김영한님이 지은신 [자바 ORM표준 JPA 프로그래밍] 책을 보고 정리한 내용입니다. 사용법 보다는 작동원리를 위주로 설명할 것이며 1~4장 내용과 매핑을 중점으로 정리할 생각입니다. 1장. 기존 SQL 작업의 문제점 1-1. JPA를 사용하는 이유는 뭘까? SQL을 다루기 위해서는 비지니스 로직보다는 SQL과 JDBC API사용 코드를 작성하는데 많은 시간을 보내야 한다. MyBatis는 이러한 SQL과 JDBC API 사용 코드를 많이 줄일 수 있었지만, 여전히 CRUD를 작성하기 위해 SQL을 반복적으로 작성해야 한다는 단점이 있었다. 또한, 가장큰 문제점은 자바는 객체지향이 중심이고 데이터베이스는 테이블이 중심이다. 즉, 객체지향적으로 설계를 하여도 SQL에 적용하기 ..
TIL @Transaction 어노테이션을 동작원리에 대해 공부하고 추가적으로 ACID에 대해 공부하고자 합니다. 우테코의 테크톡 영상을 기반으로 정리하였습니다! https://www.youtube.com/watch?v=aX9c7z9l_u8&t=188s 트랜잭션 트랜잭션이란 하나의 단위로 처리되길 바라는 쿼리문의 묶음이라고 할 수 있다. 일련의 업무는 절대 분리되어서는 안되고 일부만 실행되어서도 안된다. 즉, 절대로 깨져서는 안되는 하나의 작업을 트랜잭션이라고 한다. ex) 은행업무에서 A사용자가 B사용자에게 돈을 이체시 중간에 작업이 중단되면 안된다. 중단이 된다면 Rollback이 되던가 아니면 일련의 업무를 모두 수행하고 Commit이 되어야 한다. 이렇게 이체작업에서 이체 과정 전체를 트랜잭션이라..
이번에는 servlet의 심화 또는 대표주자인 dispatcher-servlet에 대해서 알아보도록 하겠습니다. 1. Dispatcher-Servlet(Dispatcher 서블릿)의 개념 dispatcher-servlet에서 dispatch는 보내다라는 뜻을 가지고 있다고 합니다~ 이해에 도움이 될 것 같군요! 더보기 Servlet Container에서 HTTP프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층의 제일앞에 둬서 중앙집중식으로 처리해주는 프론트 컨트롤러(Front Controller) 이것을 설명해주자면, 클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿컨테이너가 요청을 받는데, 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 *프론트 컨트롤러를 Spring에..
기존의 Spring MVC에서는 xml을 활용하여 Bean을 등록하고 있었다. 하지만 프로젝트의 규모가 커짐에 따라 사용하는 요소들을 xml에 등록하는 것이 상당히 번거로워 져서 어노테이션(Annotation, @)를 활용한 Bean 등록 방법이 탄생하게 되었다. 이번에는 Spring에서 Bean을 등록하기 위해 활용가능한 @Bean, @Component, @Configuration 어노테이션에 대해서 알아보도록 하겠다. 1. Spring Bean이란? [ Spring Bean 이란? ] Spring에서는 Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)를 Bean이라고 부르며, 이러한 Bean들은 Spring을 구성하는 핵심 요소이다. Spring의..
1. 빈 스코프(Bean Scope)의 종류 Spring의 Bean은 별다른 설정이 없으면 Singleton Scope로 생성된다. 특정 타입의 Bean을 하나만 만들어 두고 공유해서 사용하기 위해서인데, 이러한 까닭에 Bean에 상태를 저장하는 코드를 작성하는 것은 동시성 문제를 유별하여 위험한 상황을 초래할 수 있다. 하지만 요구사항과 구현 기능 등의 필요에 따라서 비싱글톤이 필요한 경우도 많다. 그리고 이를 명시적으로 구분하기 위해서 scope라는 키워드를 제공한다. Spring 에는 다음과 같은 Scope들이 존재한다. [ Scope의 종류 ] 싱글톤 Spring 프레임워크에서 기본이 되는 스코프 스프링 컨테이너의 시작과 종료까지 1개의 객체로 유지됨 프로토타입 프로토타입 빈의 생성과 의존관계 주..
1. AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)이란? [ AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)이란? ] 프로그래밍을 하다보면 공통적인 기능이 많이 발생한다. 이러한 공통 기능을 모든 모듈에 적용하기 위해 상속을 이용한다. 하지만 Java에서는 다중 상속이 불가능하며, 상속을 받아 공통 기능을 부여하기에는 한계가 있다. 예를 들어 우리가 개발한 API의 호출 시간을 측정하고 싶다고 하자. 이를 AOP없이 구현한다면 어떻겠는가? AOP를 적용하지 않는다면 중복 코드가 발생할 소지가 있고, 코드의 변경이 필요하면 여러 코드에 종속적으로 변경이 필요할 것이며, 핵심적인 비지니스 로직에 호출 시간 측정이라는 부수적인 로직이 추가되..
1. 다양한 의존성 주입 방법 Spring 프레임워크의 핵심 기술 중 하나가 바로 DI(Dependency Injection, 의존성 주입)이다. Spring 프레임워크와 같은 DI 프레임워크를 이용하면 다양한 의존성 주입을 이용하는 방법이 있는데, 각각의 방법에 대해 알아보도록 하자. [ 1. 생성자 주입(Constructor Injection) ] 생성자를 통해 의존 관계를 주입하는 방법이다. @Service public class UserServiceImpl implements UserService { private UserRepository userRepository; private MemberService memberService; @Autowired public UserServiceImpl(U..