fragile and resilient

분류 전체보기 33

[Spring, AOP] 테스트 격리를 위한 MockRestServiceServer 초기화

모아모아 프로젝트에서 외부 API와 연동된 테스트를 진행하면서 겪었던 이슈에 대해 정리해 보고자 합니다. 문제 상황 이번 스프린트에서 슬랙 알림을 도입하기로 하여 알림 로직을 구현하였는데요. 기능을 구현하는 데에는 문제가 없었지만, 알림 기능 테스트를 진행하면서 해당 오류를 마주쳤습니다. 오류는 MockRestServiceServer에서 발생하고 있었는데요. 내용을 살펴보면 예상되지 않은 추가 요청이라는 문구를 확인할 수 있었습니다. 본격적으로 문제를 살펴보기 전에 간단하게 프로젝트 로직에 대해 설명해 드리겠습니다. 프로젝트에서는 외부 API와 통신하며 동작하는 기능(Github OAuth, Slack Alarm)이 있는데요. 해당 작업은 RestTemplate를 사용해서 통신하고 있습니다. (RestT..

Spring 2022.10.11

[MySQL] 인덱스 정리

인덱스란? 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가지고 오려면 시간이 오래 걸립니다. 따라서 컬럼의 값과 해당 레코드가 저장된 주소를 key-value 형태로 인덱스를 만들어 두는 것입니다. DBMS의 인덱스는 주어진 컬럼의 값을 기준으로 정렬해서 보관합니다. 인덱스는 INSERT, UPDATE, DELETE의 성능을 희생하고, 그 대신 읽기(Select)의 성능을 높이는 기능이다. 새로운 키를 추가하는 과정에서 B-Tree의 리프 노드가 꽉 찼을 경우, 리프 노드가 분리되어야 하는데 해당 작업은 상위 노드들까지 영향을 미치기 때문에 비용이 많이 드는 작업이기 때문입니다. 인덱스는 SELECT 뿐만이 아니라 UPDATE, DELETE를 처리하기 위해 해당 레코드를 검색하는 경우에도 ..

Storage 2022.09.26

[Java] Thread Pool

Thread Pool은 매번 요청이 올 때마다 스레드를 생성하고 수거하는 것이 아닌, 설정한 스레드 수만큼 미리 생성하여 사용하는 것을 말합니다.Thread Pool이 필요한 이유새로운 스레드를 생성할 때마다 스레드를 위한 메모리 영역(스택)을 확보하고, 스레드가 더 이상 필요 없으면 해당 메모리 영역을 회수하는데, 이는 오버헤드가 큰 작업입니다.Executors 클래스의 정적 메서드를 통해 ExecutorService의 구현 객체를 제공받아 스레드 풀을 생성할 수 있습니다.먼저 ThreadPoolExecutor를 설명하기 위해, Thread Pool 종류 중 하나인 newFixedThreadPool() 메서드를 살펴보겠습니다.내부에서 ThreadPoolExecutor 클래스 생성자를 호출하고 있는데요...

Java 2022.09.12

[Java] 스레드 동기화 - Synchronized

얼마 전 팀 프로젝트에서 모집 인원이 초과하였는데도 스터디 참여가 가능한 일이 발생했다.상황에 대한 설명을 덧붙이면 모집 인원이 3명이고, 현재 2명이 참여한 상태에서 동시에 추가로 2명이 참여 버튼을 누를 경우 가입이 성공하여 총 4명이 되는 문제였다.'스터디 참여자 수’라는 공유 자원이 존재하여 동시성 문제라고 생각하여 스터디 참여를 처리하는 메서드에 synchronized 키워드를 붙여주니까 발생하지 않았다. 해당 문제를 팀원들과 인지한 후 동시성 문제에 대한 이야기를 많이 했는데, 현재 방법이 비효율적인 방식일 수도 있으니 해당 방법 이외의 더 좋은 방식으로 풀 수는 없는지 고민하기로 했다. 자바는 스레드 동기화를 지원하는 방법들을 제공하는데, 그중 위에서 언급한 synchronized에 4가지 ..

Java 2022.09.11

[Logging] Logback이란?

로깅이란? 로깅은 시스템이 실행될 때, 시간의 경과에 따라 시스템의 상태 및 동작 정보를 기록하는 것을 말합니다. 로깅이 필요한 이유 애플리케이션에 문제가 발생했을 경우, 문제를 파악하기 위해서는 당시의 동작 및 상태 정보가 필요합니다. 사용자 로그 데이터를 활용할 수 있습니다. SLF4J Logger 추상체로 SLF4J는 logback이나 log4j2와 같은 로깅 프레임워크의 인터페이스의 역할을 한다. Logback 로깅 프레임워크 중 하나로 SLF4J의 구현체이다. Logback 은 log4j 이후에 출시된 Java 기반 Logging Framework 중 하나로 가장 널리 사용되고 있다. Logback 구조 Logback은 logback-core, logback-classic, logback-acc..

정리 2022.08.26

[Spring] 테스트 시간 최적화 (feat.Context Caching)

기능 구현이 늘어나면서 테스트 코드 또한 많아졌는데요. 그에 따라 필연적으로 테스트를 돌리는 시간이 점점 늘어나게 되고, 피드백을 받는 시간이 딜레이됐습니다. 전체 테스트를 돌리는 시간이 꽤 걸리다 보니, 개발을 진행하다가 흐름이 끊기는 것 같은 느낌이 들 때도 있었습니다. 만약 각각의 테스트마다 새로운 스프링 컨텍스트를 띄우면 어떨까요? 매번 새로운 컨텍스트를 띄우기 때문에 테스트를 돌리는 시간이 매우 오래 걸릴 것입니다. 따라서 스프링에서는 Context Caching이라는 것을 제공하는 데요. 스프링은 테스트가 사용하는 컨택스트를 캐싱해서 여러 테스트에서 하나의 컨텍스트를 공유할 수 있는 방법을 제공합니다. 동일한 컨텍스트 구성을 갖는 테스트끼리는 같은 컨텍스트를 공유하는 것입니다. 테스트용 컨텍스..

Spring 2022.08.15

[Network] HTTPS 동작원리

대칭키와 공개키 비교대칭키 암호법암호화할 때 사용하는 키와 복호화할 때 사용하는 키가 같다.발송자와 수신자 모두 통신을 위해 비밀 키를 똑같이 공유한다.공개키 암호법두 개의 비대칭 키를 사용한다.하나는 호스트의 메시지를 암호화하기 위한 것이며, 다른 하나는 그 호스트의 메시지를 복호화 하기 위한 것이다.암호화 키는 모두에게 공개되어 있지만, 개인 복호화 키는 호스트만이 알고 있다.혼성 암호 체계공개키 암호 방식은 공개키를 알면 그 키에 대응되는 공개 서버에 안전하게 메시지를 보낼 수 있게 해준다.그러나 공개키 암호 방식의 알고리즘은 계산이 느린 경향이 있다.따라서 실제로는 대칭과 비대칭 방식을 섞어서 쓴다.노드들 사이의 안전한 의사소통 채널을 수립할 때는 공개키 암호화 방식을 사용하고, 이렇게 만들어진 ..

CS 2022.07.30

OAuth 2.0 인증 과정

OAuth는 인증 / 인가를 위한 개방형 표준 프로토콜로, 사용자가 인터넷 서비스(facebook, 카카오톡 등) 기능을 다른 애플리케이션에서도 사용할 수 있도록 한 것입니다. 위 글만 봐서는 OAuth가 무엇인지 감을 잡기 어려울 것이라 생각합니다. OAuth와 로그인을 일상생활 예시에 빗대어 비교한 글이 있는데요. 해당 글을 읽으면, OAuth의 동작 과정을 직관적으로 이해하는 데 도움이 될 것 같습니다. 간단하게 요약하면 회사 건물에 출입할 때, 회사 사원이 사원증을 가지고 출입하는 것이 로그인이고, 외부인이 방문증을 수령한 후 회사에 출입하는 것이 OAuth입니다. 글의 전문을 읽으시면 더 도움이 되실 것 같습니다. https://d2.naver.com/helloworld/24942 OAuth 인..

정리 2022.07.10

[Spring] Pageable 커스텀 예외 처리(feat. @PageableDefault)

Pageable을 사용해 Pagination을 하는 과정에서, 요구 사항에 맞추어 예외를 처리해야 하는 경험을 했습니다. 저희 팀의 요구 사항은 아래와 같습니다. 요구 사항 page, size에 값이 모두 없을 경우, default로 page = 0, size = 5를 설정한다. size에 0이 들어오거나 page, size에 문자열, 음수가 들어올 경우 400 에러를 응답한다. Pageable을 사용하면서, 위 요구 사항에 맞추어 구현한 경험에 대해 공유하고자 합니다. 1) Pageable page, size Default 값 지정 @RestController public class StudyController { //... @GetMapping("/api/studies") public Response..

Spring 2022.07.05

[Spring] DispatcherServlet 동작 과정과 Special Bean Types

Spring MVC는 front controller pattern으로 설계되어 있는데, 여기서 front controller가 바로 DispatcherServlet입니다. DispatcherServlet은 요청에 필요한 공통된 알고리즘을 제공하고, 실제 동작은 각각의 적절한 컴포넌트에게 위임합니다. 또한 다른 Servlet과 마찬가지로 Java configuration이나 web.xml에 선언하여 매핑되어야 하는데요. DispatcherServlet은 Spring configuration을 통해 request mapping, view resolution, exception handling에 필요한 컴포넌트를 찾습니다. DispatcherServlet은 설정을 위해 WebApplicationContext을..

Spring 2022.07.03