전체 글 10

[spring boot] Async 비동기 메소드 사용하기

💡 들어가며 Spring boot 프레임워크를 이용한 rest api 서버에 FCM을 이용한 푸시알림 서비스, 이메일 인증 서비스를 구현하게 되었는데 앞서말한 2가지 기능처럼 외부 api 통신 등의 네트워크를 이용하면 꽤 긴 딜레이가 발생한다는걸 알게 되었습니다. 이와같은 딜레이를 어떻게 제거할까 고민해보았는데요, 곰곰히 생각해보니 푸시알림이나 이메일 전송등을 호출하는 로직은 해당 api의 핵심로직이 아니고 단순 알림을 위한 기능이였으므로 일단 api호출에 대한 응답을 먼저 넘기고, 스프링이 알아서 이메일을 보내든 푸시알림을 보내든 다른기능을 하도록 할 수 없을까? 하는 생각이 들어 방법을 알아보던중 비동기로 메소드를 실행할 수 있다는것을 알게 되었고 구현해보았습니다. 🤔 근데 비동기가 뭐지? 비동기..

Firebase Cloud Message(FCM) 스프링 부트 프로젝트에 적용하기

FCM이란?☁️ Firebase 클라우드 메시징(FCM)은 무료로 메시지를 안정적으로 전송할 수 있는 교차 플랫폼 메시징 솔루션입니다. - firebase 공식 홈페이지 참고문서 이 글에선 FCM에 대한 원리 설명, 설정보다 스프링 프로젝트에 적용하는 과정에 대해 설명하고자 한다. 초기설정 방법과 원리설명 등은 공식문서에 잘 정리되어 있으니 링크를 참고하길 바란다. 스프링 부트 프로젝트에 적용하기 요약 스프링 프로젝트에서의 FCM 사용 방법은 다음과 같다 1. 유저 테이블에 FCM 토큰 저장하는 컬럼 추가 2. 토큰 저장하는 REST API 생성 3. 특정 유저의 저장된 토큰으로 알림메시지 보내는 FCM 서비스 구현 + 4. 알림을 보내기 원하는 동작의 컨트롤러에서 비동기로 FCM 서비스 호출 + 5. ..

[Spring]Jenkins로 ec2 서버에 원격 배포하기 (publish over ssh 없이)

Jenkins - github 연동이 완료되었다고 가정합니다! 참고: Jenkins github와 연동하기 : https://goddaehee.tistory.com/258 (갓대희님 블로그) 기존 원격으로 ec2 서버에 jenkins로 빌드한 jar 파일을 배포하는 방법인 publish over ssh플러그인이 젠킨스 보안정책상 배포 중단되었습니다. (22.01.12) https://www.jenkins.io/security/advisory/2022-01-12/ Jenkins Security Advisory 2022-01-12 Jenkins Security Advisory 2022-01-12 This advisory announces vulnerabilities in the following Jenkin..

[Spring] 예외 발생은 어디서 해야할까?

스프링에서 예외발생은 어느 계층에서 이루어져야할까? Controller? Service? Repository? ... 결론부터 말하자면 모든 계층에서 발생할 수 있다. 단, 예외의 유형을 정의하는것은 바람직하다. 가령 권한(401)에 대한 검증은 컨트롤러, 유효성(404)에 대한 검증은 서비스 처럼 말이다. 객체지향적 관점으로 봤을 때 해당 클래스가 객체로써 올바르게 작동할 수있는가? 를 따져보아 개발자가 직접 선택하면 된다. Question.만약 권한에 대한 검증을 서비스에서 한다면? Answer. 권한에 대한 검증을 서비스에서 진행한다면 해당 서비스를 다른 컨트롤러 또는 서비스에서 이용함에 있어 권한문제를 통과하지 못할 수 있다는 불확실성이 생긴다. 반드시 권한이 있는 유저가 그 서비스 메소드를 호출..

[Spring] DTO의 객체변환은 어느 계층에서 하는것이 적절할까?

스프링 프로젝트를 진행하다보니 DTO 객체를 사용하는 계층이 정확히 정의되지 않았다 는 문제점을 발견하고 어느 계층까지 DTO를 전달하는것이 맞을까? (어느 계층에 DTO를 엔티티로 변환하는 로직이 존재해야하는가) -> 이 로직을 컨트롤러, 서비스, 리포지토리 어느계층에 두어야 하는가? 를 고민하게 되었다. PROBLEM. DTO 와 엔티티(VO)간의 변환 로직을 어느 계층에 두는것이 적절할까? 별 생각없이 컨트롤러에서 DTO를 엔티티로 변환하여 서비스로 넘기는 방식으로 구현하고보니 지나치게 많은 로직이 컨트롤러에 포함되어있음을 알게되었다. 사용자 인터페이스의 역할을 하는 컨트롤러에 서비스에 있어야할 로직들이 포함되는 문제가 발생한다. but DTO를 서비스단으로 넘긴다면? 우선 서비스는 리포지토리를 D..

AWS DB 인스턴스 MySQL 시간설정

1. 현재 db 시스템의 시간을 확인한다. select now(); 현재 시간과는 다른 시간이 나온다 (서울기준) 2. db의 timezone이 어디로 지정되어있는지 확인한다. show variables like 'time_zone'; UTC로 설정되어있다. (그리니치 천문대가 있는 영국의 시간) 3. 시간을 바꾸려고 aws 사이트를 뒤져보았다 내 mysql 엔진은 8.0이므로 db 파라미터 그룹에서 시간을 변경하기로 한다. 4. 시간 변경에대한 aws의 의견은 아래와 같다 어플리케이션을 운용할 때에 UTC 시간을 사용하는것이 이후 수정의 필요가 없어지므로 제일 좋다고 한다. 대신 어플리케이션 계층에서 시간을 변환하여 사용하는것을 추천한다. 하지만 토이프로젝트를 진행하는 현재 편의성을 위해 본 게시글에서..

컴퓨터과학/SQL 2021.08.03

[Spring] 페이지 리로드(새로고침)시 발생하는 데이터 중복전송 현상 방지

문제확인 웹페이지를 이용하다보면 서버에 데이터가 중복으로 전송되는 현상이 발생한다. 예로 로그인 실패 직후 새로고침을 하면 이전에 진행된 데이터 전송 프로세스가 반복돼서 실행되며 이로인해 불필요한 연산이 진행되고, 뷰로 로그인 실패에 관한 정보를 다시 전송하게된다. (로그인 실패 → 잘못된 아이디 입력 alert표시 → 새로고침 → 다시 잘못된 아이디 입력 alert ... ) 원리 이러한 현상을 어떻게 방지할지 고민하다가 새로고침시 호출되는 컨트롤러(핸들러)는 최종으로 리다이렉트된 컨트롤러임을 알게되었고, 이 작동방식을 이용해 문제를 해결하였다. 실행 이를 위해선 최초 데이터 수신 컨트롤러와 리다이렉트 이후 뷰로 데이터를 전송하는 컨트롤러를 구분하였다. 1. 데이터 수신 컨트롤러 @PostMapping..

[SQL] order by를 이용한 정렬방식의 과부하와 인덱스를 통한 해결방법

수십, 수백만 개의 데이터를 리스트할 때, order by를 사용하게되면 각각의 데이터를 방문하며 소팅(sorting)하게 되면서 엄청난 성능저하가 일어나게 된다. 이 때 인덱스 칼럼을 지정해서 pk보드로 만들어둔다면 이미 정렬되어있는 인덱스를 통해 성능저하 없이 데이터를 정렬할 수 있게된다. 예시 select /*INDEX_DESC(tbl_board pk_board)*/ * from tbl_board where bno > 0 pk_board는 테이블 생성시 제약조건으로 지정한것으로 tbl_board를 pk_board의 내림차순으로 정렬하는 방식으로 tbl_board를 조회하게된다. 여기서 /* */ 내부값은 오라클에서 사용하는 '힌트'로, select문을 처리하는 방법에대해 기술을 하며 이에따라 sql..

컴퓨터과학/SQL 2021.03.02

[Docker] (MAC) Docker port is already allocated 해결방법

컴퓨터를 강제종료 시키거나 도커를 비정상적으로 종료했을때 포트가 이미 할당되어있어 기존에 사용하던 어플리케이션을 가동하지 못하는 경우가 있다. 이럴때는 귀찮지만 강제로 해당 포트를 사용하고있는 프로세스를 종료해야한다. 하지만 sudo lsof -l : port 명령어를 사용해도 제대로 찾아내지 못하는 경우가 있다. 이럴때는 sudo lsof -PiTCP -sTCP:LISTEN 를 이용하여 전체 프로세스를 로드한 뒤, sudo kill -9 를 통해 프로세스를 강제종료하면 된다. (lsof -i만으로 프로세스 조회가 된다면 그대로 진행하면 된다.)

[Spring] 스프링(Spring) 이란?

웹(Web)이라는 분야를 공부하기로 결정하고 학습 루트를 탐색하다보면 가장 많이 나오는 키워드중 하나는 스프링이다. 물론 요즘에는 스프링 이외에도 노드js(Node,js) 자식뻘인 스프링부트 등 다양한 프레임워크가 존재하지만, 아직까지 인기있는 현역 프레임워크라는 사실은 틀림없다. 01. 스프링이란? "스프링은 웹사이트 개발을 위한 백엔드 프레임워크이다" 백엔드 (Back-end): 웹 개발 프로세스를 프론트(Front-end), 백엔드(Back-end)로 구분하는데, 일반적으로 서버단에서 동작하는 프로그램(DB, API서버 ..)을 다루는 프로세스를 백엔드 라고 한다. 프레임워크 (Framework): 프로그램 설계에 있어 미리 구축되어있는 뼈대 라고 이해하면 쉽다. 백엔드 프로세스를 구축하는데 있어 ..

반응형