목록Backend/Spring (17)
elevne's Study Note

테스트 코드를 작성할 때에는 "Given-When-Then" 패턴과 "F.I.R.S.T" 전략을 사용할 수 있다. "Given-When-Then" 패턴은 테스트 코드를 표현하는 방식 중 하나이다. 각 테스트 코드를 세 개의 단계로 설정해서 각 단계의 목적에 맞게 코드를 작성한다. Given: 테스트를 수행하기 전에 테스트에 필요한 환경을 설정하는 단계이다. 테스트에 필요한 변수를 정의하거나 Mock 객체를 통해 특정 상황에 대한 행동을 정의한다. When: 테스트의 목적을 보여주는 단계이다. 실제 테스트 코드가 포함되며, 테스트를 통한 결괏값을 가져오게 된다. Then: 테스트의 결과를 검증하는 단계이다. When 단계에서 나온 결괏값을 검증하는 작업을 수행한다. (결과값이 아니더라도 이 테스트를 통해 ..

Logback 은 Spring MVC 에서 로그를 남길 때 사용되던 log4j 의 후속 로그 라이브러리이다. SLF4J 의 구현체로, SLF4J 의 API 를 그대로 사용할 수 있다. 이는 spring-boot-starter-web 에 포함되어 있으니 따로 dependency 를 추가해줄 필요 없다. 로그를 사용할 때에는 로깅으로 인한 side effect 가 생기게 해서는 안된다. 예를 들어, 로그를 남기는 로직에서 예외가 발생하여 프로그램이 정상적으로 동작하지 않는 일이 생겨서는 안된다는 뜻이다. 각 로그에는 해당 로직에서 사용된 데이터와 설명이 들어가야 하며, 로그에는 사용자의 개인정보와 같은 민감한 정보가 들어가서는 안된다. 메소드의 input, output 을 로그로 남기면 debugger 을 ..

Apache Kafka 는 빠르고 확장 가능한 데이터 피드의 분산 스트리밍, 파이프라이닝 및 재생을 위한 실시간 스트리밍 데이터 처리 목적으로 설계된 오픈 소스 분산형 pub/sub 메시징 플랫폼이다. Kafka 는 서버 클러스터 내에서 데이터 스트림을 레코드로 유지하는 방식으로 작동하는 브로커 기반 솔루션이다. Kafka 서버는 여러 데이터 센터에 분산되어 있을 수 있으며 여러 서비스 인스턴스에 걸쳐 레코드 스트림(메시지)을 토픽으로 저장하여 데이터 지속성을 제공할 수 있다. Kafka 는 Producer/Consumer 개념을 사용한다. Publisher/Subscriber 에 각각 매칭된다고 생각하면 된다. Producer 이 Topic 에 이벤트를 보내면 해당 이벤트는 Topic 의 각 Parti..

이전 시간에 작성한 것처럼 스프링에서 제공하는 STOMP 를 통해 채팅서버를 구현할 수 있지만, 이러한 Simple Message Broker 은 스프링 서버 내부 메모리에서 작동한다. 이러한 구조에서 서바가 다운되거나 재시작하면 메시지 큐 내의 데이터가 유실될 수 있으며, 서버가 여러 대로 구성되어 있을 경우 서버간 채팅방을 공유할 수 없게된다는 문제가 발생한다. 이럴 때 외부 메시지 브로커를 활용할 수 있다. Redis 는 STOMP 를 따로 지원하지는 않지만 Redis 가 제공하는 pub/sub 기능이 있다. (STOMP 프로토콜을 지원하는 RabbitMQ 와 같은 전용 메시지 브로커를 사용하면 더 많은 기능을 사용할 수 있다고 한다) Redis 를 메시지 브로커로 추가하면 다음과 같이 동작한다. ..

pub/sub 구조에 대해 알아본다. pub/sub 는 아래 이미지와 같은 구조를 가진다. Publisher, Subsriber 로 나뉘어지며 Subscriber 들은 특정 Topic(Channel) 을 구독한다. Publisher 가 해당 Topic 으로 메시지를 발행하면 해당 Topic 을 구독하는 사용자들은 그 메시지를 받게되는 것이다. 즉, 메시지의 발행자와 이용자 사이에 1:N 관계가 형성되는 브로드캐스트 스타일의 배포 방법이라고 볼 수 있다. (e.g., 항공사에서 항공편의 착륙 시간 또는 지연 상태에 관한 업데이트를 배포할 경우, 여러 관계자가 이 정보를 활용할 수 있다. 지상 팀은 항공기 정비 및 급유를 진행하고 수화물 팀, 승무원, 조종사는 비행기의 다음 일정을 준비하며 비주얼 디스플레이..
Jwt 각종 처리를 담당하는 JwtService 코드를 정리해본다. 우선 토큰을 생성하는 메소드부터 살펴보았다. public String generateToken( Map extraClaims, UserDetails userDetails ) { return Jwts .builder() .setClaims(extraClaims) .setSubject(userDetails.getUsername()) .setIssuedAt(new Date(System.currentTimeMillis())) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60)) .signWith(getSignInKey(), SignatureAlgorithm.HS256) .compac..

WebSocket 은 두 프로그램 간 데이터를 주고받기 위해 사용되는 통신 방법 중 하나이다. 양방향 통신 (통상적인 HTTP 는 단방향), 실시간 네트워킹을 지원한다. 웹소켓 이전에 사용된 비슷한 기술들이 있다. 첫 번째로 Polling 이라는 것이 있다. 이는 서버에 일정 주기로 요청을 송신, 응답을 받는 방법이다. 실시간 통신에서는 언제 통신이 발생할지 모르기 때문에 불필요한 Request, Connection 을 계속 생성한다. 그 다음으로는 Long Polling 이라는 것이 있다. 이는 서버에 요청을 보내고 응답을 받을 때까지 연결을 종료시키지 않는다. 응답을 받으면 끊고, 재용청한다. 어느정도 Polling 의 단점을 개선하기는 하였으나, 많은 양의 메시지가 흐를 경우 Polling 과 같은..

JWT, JSON Web Token 에 대해서 우선 간단하게 알아보았다. JWT 를 많이 사용하기 이전에는 쿠키 또는 세션을 활용하여 인증/인가를 구현하였다. 하지만 쿠키는 클라이언트 측에서 정보 위변조가 가능하다는 단점을, 세션은 사용자가 로그인할 때마다 사용자 세션 정보를 담은 객체를 생성하게 되고 매 요청마다 DB 에 접근하기 때문에 서버에 부담이 크다는 단점을 가지고 있다. JWT 는 이러한 문제점들을 해결해준다. JWT 는 말그대로 JSON 형태를 가진 일종의 토큰으로, 해당 토큰을 가진 사용자는 권한 증명을 할 수 있는 것이다. JWT 는 상대적으로 서버의 부담을 줄여주며, 암호화된 토큰을 사용하여 안전한 통신이 가능하다. 또, 토큰 발행 전용 서버를 개설하여 서버의 부담을 완화해줄 수 있으며..