[Spring] Filter에서 Exception을 관리하는 법
·
BackEnd
Jwt 토큰을 통한 인증, 인가를 구현하던 중 발생한 문제점과 그에 대한 해결법을 정리했습니다.제가 구현한 Spring 서버는 다음과 같은 프로세스를 가집니다. 사용자가 로그인 합니다.로그인 성공시 token을 발급합니다.발급 받은 토큰으로 인가가 필요한 url에 접근 할 때, header에 Token을 담아서 옵니다.미들웨어인 Filter가 인가에 대한 로직을 처리후 성공한다면 비즈니스 로직을 거친후 반환합니다.구현했을 때, 성공적으로 반환하거나 혹은 제가 원하는 예외 처리가 되었을거라고 생각하고 실행한 결과전혀 다른 Response 타입이 나왔습니다. 저는 위와 같은 Response를 원했습니다. 하지만 위의 사진 처럼 예상하지 못한 Exception Response가 나오게 되었습니다. 이 상황은 ..
[System Design] 서버 확장, 로드밸런서, 그리고 무상태 아키텍처로 성능 최적화를 하는 방법
·
공부중
많은 애플리케이션의 확장 전력으로 수평적 확장을 많이 사용한다. 수평적 확장(Scale-out) 이란?수평적 확장은 수직적 확장과 반대되는 개념으로 수직적 확장은 하나의 서버를 사용하며 서버에 고사양 자원을 추가시켜 서버가 받을 수 있는 트래픽의 양을 늘린다. 예를 들면 RAM 추가 CPU 업그레이드 등과 같은 행위가 수직적 확장의 예시이다. 수평적 확장은 서버의 성능을 업그레이드 하지 않고 서버의 갯수를 증식시켜 더 많은 부하와 트래픽을 견디게 하는 방법이다.기존 1대의 서버를 운영하던 것을 더 많은 부하를 견디기 위해 물리적인 서버를 한대 더 추가하여 분산 트래픽을 이용해 서버의 부하를 줄이는 방식이다. 예를 들어, 서버가 초당 100만건의 트래픽을 받아 성능이 저하되는 경우, 수평적 확장을 고려하여..
[Spring] @RestControllerAdvice를 통한 스프링에서의 예외처리
·
BackEnd
Exception 이란?기본적으로 예외처리를 하려면 Exception의 개념부터 알아야 합니다. Exception이란, 위의 사진과 같이 Object와 Throwable을 상속하는 서브 클래스입니다. Exception은 예외적인 상황을 처리하기 위해 자바에서 제공하는 클래스 입니다. Exception에서도 CheckedException과 UncheckedException 두가지로 나뉘게 됩니다. CheckedException은 체크된 예외라고 합니다. 체크된 예외는 프로그래머가 컴파일 시점에 반드시 처리해줘야하는 예외입니다.UncheckedException은 체크되지 않은 예외입니다. 체크되지 않은 예외는 프로그래머가 알지못하는 상황에 일어납니다. 즉, 어플리케이션이 실행 도중 발생하는 예외라고 볼 수 ..
[Java] DTO - Data Transfer Object, toEntity와 toDto
·
BackEnd/Java
학습 배경자바와 스프링 부트로 프로그래밍을 하면서 DTO를 사용을 해왔지만, 올바른 DTO의 정의를 알지 못했고 바람직한 사용이 아니라고 생각되었습니다. DTO를 제대로 알고 어떤 상황에서 사용해야 하는지 정리하기 위해 학습했습니다.DTODTO란 계층간 데이터 전송을 위해 도메인 모델 대신 사용되는 객체 입니다.여기서 계층이란, Controller, Service, Repository 등을 의미합니다.DTO는 순수한 데이터를 저장하고, 데이터에 대한 getter, setter 만을 가져야 한다고 정의 되어 있습니다. DTO는 어떠한 비즈니스 로직을 가져서도 안됩니다.DTO를 왜 사용하나요?처음에는 User 객체를 굳이 UserDto에 담에서 보내는 이유가 뭘까? 라고 생각을 했습니다.User 그대로 보내..
우테코 프리코스 1주차 미션 회고 및 정리 - 1
·
BackEnd/Java
우아한 테크 코스 1주차 미션인 문자열 덧셈 계산기를 구현하는 과정과 이를 통해 어떤 점에서 어려움을 겪었고 어떤 점을 개선했는지 정리하겠습니다.문자열 덧셈 계산기기능 요구 사항입력한 문자열에서 숫자를 추출하여 더하는 계산기를 구현한다.쉼표(,) 또는 콜론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 각 숫자의 합을 반환한다.예: "" => 0, "1,2" => 3, "1,2,3" => 6, "1,2:3" => 6앞의 기본 구분자(쉼표, 콜론) 외에 커스텀 구분자를 지정할 수 있다. 커스텀 구분자는 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 사용한다.예를 들어 "//;\n1;2;3"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결..
[Java] 스트림이란? 스트림의 사용이유와 컬렉션과 비교 예제
·
BackEnd/Java
스트림이란? 스트림의 사용이유Stream자바 8 에서 추가된 Stream은 데이터 처리기능을 가지고 있으며, 데이터 처리 효율을 높여줍니다.Stream의 사전적 의미는 ‘시냇물’이라는 의미를 가지며, 연속적인 사물이나 사람의 흐름 이라고 정의합니다.Stream은 시간상에 나타나는 일련의 데이터 요소라고 정의함. 이는 데이터 집합의 의미보다는 연속적인 데이터의 흐름이라고 말하기 더 적합합니다.결론적으로 Stream을 이용하면 일련의 데이터 처리 연산을 함수형 연산을 통해 표준화된 방법으로 쉽게 가공하고 처리할 수 있습니다.Stream의 사용 이전에는 Collection으로 사용했었고 이는 코딩작업이 길어지며 가독성이 불편하여 작업할 때의 애로사항이 많았습니다.하지만 Stream은 기존의 Collection..
[Test] TDD - Test Driven Development
·
BackEnd/Java
TDD란?TDD = TFD(Test First Development) + 리팩토링TDD란 프로그래밍 의사결정과 피드백 사이의 간극을 의식하고 이를 제어하는 기술이다. - 켄트벡, Test Driven Development by Example 중TDD의 아이러니 중 하나는 테스트 기술이 아니라는 점이다. TDD는 분석 기술이며, 설계 기술이기도 하다. - 켄트벡, Test Driven Development by Example 중TDD를 하는 이유디버깅 시간을 줄여준다.동작하는 문서 역할을 한다.변화에 대한 두려움을 줄여준다.TDD 사이클실패하는 테스트를 구현한다.테스트가 성공하도록 프로덕션 코드를 구현한다.프로덕션 코드와 테스트 코드를 리팩토링한다.TDD 원칙원칙 1 - 실패하는 단위 테스트를 작성할 때까..
[Java] synchronized - 동기화
·
BackEnd/Java
한번의 하나의 스레드만 사용할 수 있게 만든다.둘 이상의 스레드가 공동의 자원을 공유하는 경우, 순서에 맞춰서 접근이 필요하고  스레드에 대한 동기화를 이용해서 하나의 자원에 접근하려 할 때, 주어진 순간에는 오직 하나의 스레드만 접근 가능하도록 하는 것모든 객체는 내부에 자신만의 lock을 가지고 있다.- 모니터 락 이라고 부른다- 객체 내부에 있어서 확인이 어렵다스레드가 synchronized 키워드가 있는 메서드에 진입 하려면 반드시 해당 인스턴스의 락이 있어야 한다. 이 상황을 실제 우리가 살아가는 상황에 대입해볼 수 있다.(저는 개인적으로 락 = 키 라고 생각하는것이 이해가 빨랐습니다.)만약 우리가 화장실에 들어가야 하는 상황이라고 가정한다. 화장실에 들어가려고 하는데, A가 이미 들어가서 사용..