FCM(Firebase Cloud Messaging)을 Spring boot에서 테스트 하기 좋은 코드로 만들어보기
·
BackEnd
일단 이 글을 작성하기 전에 알아야 할 부분이 있다.테스트 하기 좋은 코드는 뭘까?개인 사이드 프로젝트를 진행하면서 가장 어렵고도 고민이 많이 되는 부분이 바로 테스트에 대한 부분이다.테스트는 프로그램의 안정성을 확보해주는 동시에 메서드 하나하나의 동작을 예상가능하게 만들어야 된다고 생각했다.예를 들어서, 계산기의 plus 라는 메서드가 존재한다고 생각해보자.public int plus(int a, int b) { return a + b;}이런식의 메서드가 나올 것이다. 이것은 테스트 하기 아주 좋은 코드라고 생각된다. 이유는, 항상 동일한 입력에 대해서 동일한 출력을 반환한다. 1과 2가들어가면 항상 3이라는 결과가 100번 1000번 1만번을 해도 동일하다. 이러한 경우 메서드가 예측 가능하기 ..
[Spring] FCM + 스프링 부트로 푸시 알림 구현 고민하기
·
BackEnd
푸시알림(Push Notification)이란?푸시알림은 사용자의 스마트폰이나 컴퓨터에 실시간으로 전달되는 메시지나 알림을 말함푸시 알림의 특성1. 실시간성앱이나 웹사이트가 실행되고 있지 않아도 즉시 메시지가 전달됨서버에서 발생한 이벤트를 지연 없이 사용자에게 전달 가능2. 양방향 통신서버에서 사용자 기기로 직접 메시지를 '푸시(밀어넣기)'할 수 있음전통적인 폴링(polling) 방식과 달리 효율적인 리소스 사용이 가능함3. 다양한 용도커뮤니케이션: 새로운 메시지나 이메일 알림마케팅: 할인 정보나 프로모션 안내시스템: 앱 업데이트 알림안전: 날씨 경보나 긴급 상황 전파생산성: 일정 리마인더4. 맞춤형 설정사용자가 원하는 종류의 알림만 선택적으로 받을 수 있음알림 시간대, 빈도 등을 개인화할 수 있음푸시 ..
[CS] 컴퓨터와 문자 인코딩
·
공부중
텍스트 데이터와 문자 인코딩 데이터트랜지스터를 통해 0과1의 이진수를 표현가능하다. 꺼지면0 켜지면1트랜지스터의 모음 - RAM현대의 컴퓨터 메모리는 RAM은 초당 수십억번의 데이터를 사용가능하다.1bit를 추가할 때 마다 표현할 수 있는 숫자는 두배가 된다. 2 4 8 16 … (8bit = 1바이트)8비트 기준 양수라면 0~255, 음수표현이 되어야한다면 -128 ~ 127 까지, 표현은 256가지만 가능하다.컴퓨터와 문자 인코딩문자 인코딩: 문자 집합을 통해 문자->숫자 변환문자 디코딩: 문자 집합을 통해 숫자->문자 변환ASCII 문자집합서로다른 컴퓨터 간의 문자집합을 가지면 일관적이지 못하기 때문에 표준을 가지고 호환성 문제를 해결하기 위해 표준 문자집합인 ASCII가 만들어짐American S..
[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"과 같이 값을 입력할 경우 커스텀 구분자는 세미콜론(;)이며, 결..