본문 바로가기

전체 글

(41)
AWS EC2 + Jenkins + Github 활용한 Spring Boot CI/CD 구축 이번 포스팅에서는 AWS EC2서버에 젠킨스와 Github를 연동하여 Spring Boot 프로젝트가 자동 배포되도록 CI/CD를 구축해 보려고 합니다. 전 회사에서는 gitlab에 push후에 젠킨스에 들어가서 배포 버튼을 눌러서 배포하였지만, 자동으로 배포되는 환경을 가진 회사들도 많은 것 같아 공부하게 되었습니다. AWS EC2는 만들어져 있다는 가정하에 글을 작성하도록 하겠습니다. Jenkins 설치 및 시작 Jenkins & GitHub 연동 Jenkins & Spring Boot CI/CD 구축 Jenkins 설치 및 시작 1. 젠킨스를 실행하기 위해서는 java도 필요하기 때문에 명령어를 통해 자바를 설치하도록 하겠습니다. sudo yum install java-11-amazon-corret..
@Transactional 격리 수준 - 오류 발생 경험 이번 포스팅에서는 @Transaction의 격리수준을 알고 있었지만, 실제 운영환경에서 에러를 냈던 경험에 대해서 포스팅하려고 합니다. 그리고 격리수준에 대해서는 간단하게만 적어보려 합니다. 트랜잭션 격리 수준(4단계) 트랜잭션의 격리 수준이란?? 동시에 여러개의 요청이 들어왔을때, 트랜잭션별로 영향을 끼치는 정도라고 생각하면 될 것 같습니다. 그리고 그 격리 수준에따라 다른 트랜잭션이 변경 된 데이터를 읽을 수 있는지 없는지 결정되게 됩니다. 간단하게 격리 수준을 정리해보면.. 아래와 같이 4단계로 구분이 됩니다. READ_UNCOMMITED(0단계) 1. commited되지 않은 데이터를 읽을 수 있는 격리 수준이기 때문에 데이터의 정합성이 맞지 않을 확률이 큽니다. 2. Dirty Read 발생 가..
Thread를 활용한 비동기 처리 회사에서 신규 고객센터를 개발하는 일을 담당하게 되었습니다.어느 정도 고객센터 개발이 완료되는 시점에서 고객들의 상담 접수 및 상담원들의 상담 완료 처리가 되면 고객들에게 이메일 알림을 보내는 기능을 추가하게 되었고, 실제로 JavaMail 라이브러리만 다운받으면 쉽게 기능 구현을 할 수 있었습니다.기능 구현을 완료한 시점에 테스트를 해 본 결과 상담 접수 시간이 3초 ~ 5초 정도 늘어난 것을 발견하였고, 원인은 이메일 전송 때문이라는 것을 알게 되었습니다.고객센터 상담 건 접수 기본 로직먼저, 간단하게 고객센터의 기본 로직은 4가지 단계로 이루어져 있습니다.1. 고객들의 문의 접수2. AWS S3에 이미지 저장3. 상담원들에게 상담 건 자동 배분4. 이메일 전송(알림용)이메일 전송 부분이 추가 되면서..
[Spring Security] SecurityContextPersistenceFilter 이해 이번 포스팅에서는 SecurityContext 객체의 생성, 저장, 조회하는 역할을 담당하는 SecurityContextPersistenceFilter에 대해서 공부해 보도록 하겠습니다. 이 필터같은 경우 ThreadLocal에 인증 후 세션에서 가져온 SecurityContext를 넣어주는 역할도 하기때문에 SecurityContextHolder.getContext().getAuthentication()을 통해 어디서든지 인증한 사용자의 정보를 가져오는지 공부해 볼 수 있습니다. SecurityContextPersistenceFilter의 동작방식을 살펴보면 아래와 같은 Flow로 진행되는 것을 알 수 있습니다. 이 필터에 동작방식을 코드로 보기위해 어떤 클래스가 사용되고 있는지 알아보도록 하겠습니다...
[Spring Security] 기본 API 및 Filter 이해(2) 이번 포스팅에서는 스프링 시큐리티를 크게 3가지로 알아보려고 합니다. RememberMeAuthenticationFilter 동작원리 AnonymousAuthenticationFilter 동작원리 동시 세션 제어 필터(SessionManagementFilter, ConcurrentSessionFilter) 동작원리 RememberMeAuthenticationFilter 동작원리 RememberMeAuthenticationFilter 필터는 세션에서 응답값으로 보내준 RememberMe 쿠키값을 사용하여 세션이 만료되거나 브라우저가 종료된 후에도 사용자를 기억할 수 있도록 도와주는 필터입니다. RememberMe와 관련된 API는 아래와 같습니다. @Configuration @EnableWebSecurit..
[Spring Security] 기본 API 및 Filter 이해(1) 이번 포스팅에서는 스프링 시큐리티를 크게 3가지로 알아보려고 합니다. Spring Security 의존성 주입 및 보안기능 UserNamePasswordAuthenticationFilter 동작원리 LogoutFilter 동작원리 Spring Security 의존성 주입 및 보안기능 먼저 의존성을 추가하기 위해 아래와 같이 코드를 추가해줍니다. (Gradle 기준) implementation 'org.springframework.boot:spring-boot-starter-security' 의존성을 주입하고 서버를 실행하게 되면 아래와 같은 일들이 자동으로 일어나게 됩니다. 시큐리티의 초기화 작업 및 보안설정이 이루어지게 됩니다. 별도의 설정을 하지 않아도 기본적인 보안기능이 현재 시스템에 적용됩니다. ..
[Spring] 커넥션 풀과 데이터소스 이번 포스팅에서는 커넥션 풀과 데이터소스에대해 공부하고 사용하는 이유에 대해 알아보려 합니다. 커넥션 풀 - 커넥션을 담아두는 장소 커넥션 풀을 알아보기전에 어플리케이션에서 요청이 들어오면 어떤 흐름으로 진행되는지 알아보도록 하겠습니다. 어플리케이션 요청 DB 드라이버를 통한 커넥션 요청(네트워크 통신 발생) 커넥션 반환 위와 같은 순서로 흐름이 진행됩니다. 하지만, 커넥션을 얻어오는 작업은 굉장히 무겁고 시간도 많이 들기때문에 매번 사용자의 요청이 있을때마다 커넥션을 만들어서 반환하는 방식은 트래픽이 많은 서비스에서는 적합하지 않습니다. 그래서 커넥션들을 미리 만들어두고 재사용하는 방식을 사용하게 되었는데, 미리 만들어둔 커넥션들을 담아두는 장소가 커넥션 풀입니다. 커넥션 풀을 사용하여 어플리케이션 서..
[JPA] 컬렉션 조회 최적화 이번 포스팅에서는 인프런에 있는 JPA활용2편을 공부하면서 Many TO One, One To One관계가 아닌 One To Many와 같은 컬렉션을 조회할때 최적화 하는 방법에 대해서 포스팅 해보려고합니다. V1 - 엔티티 직접 노출 말 그대로 Entity를 리턴하는 방법입니다. @GetMapping("/api/v1/orders") public List orderV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List orderItems = order.getOrderIt..