안녕하세요 정만입니다 ~ !공통 프로젝트에서 클로바 OCR API를 사용하여 인바디 검사지 사진에서 텍스트를 추출하는 기능이 있습니다. 프론트엔드에서 API 요청을 보낼 때 API 키가 헤더에 노출되는 문제를 알게된 후 백엔드에서 API를 호출 하는식으로 변경했습니다. 하지만 공식 문서의 자바 코드를 그대로 사용하였더니 가독성과 유지보수성이 좋지 않다고 생각해. Feign을 이용해 리팩토링을 해봤습니다. ✨Feign 이란 ?Feign이란 SpringBoot 애플리케이션을 위한 선언형 REST 클라이언트입니다. 여기서 "선언형"이란 API 호출을 위해 복잡한 URL 설정, 파라미터 처리, 헤더 설정 등을 직접 코드로 작성할 필요가 없고 인터페이스를 선언하는 것만으로 API호출을 처리해줍니다. Feig..
Spring
들어가면서 이번 프로젝트에서 Spring Security를 맡게되었고 인증&인가에 대해 배우게 되었다. 그 중 JWT를 사용하여 인증&인가를 진행했는데, 이때 Access Token과 Refresh Token의 차이와 역할에 대해 배우게 되었다.해당 글에서는 특히 Refresh Token이 왜 필요한지, 보안을 위해 어떻게 사용될 수 있는지에 대해 알아볼 예정이다. Refresh Token이 필요한 이유JWT은 유저의 신원이나 권한을 결정하는 정보를 담고 있다. Access Token, 즉 단일 토큰만 발행한 경우에는 다음과 같은 로직을 가진다. JWT 토큰 인증방식은 비밀키로 암호화를 하기에서버와 클라이언트는 JWT를 통해 안전하게 통신한다. 로그인 성공시 서버측에서 클라이언트로 JWT를 발급한다.권한..
서론 JPA를 이용해 프로젝트를 구성해보거나 실습을 해보았다면, 당연하게도 Entity를 만들어 사용해본 적이 있을 것이다. 그런데, 이 Entity, 낯선 annotation이 덕지덕지 붙어있어서 그렇지, 본질적으로는 자바 객체이다. 즉, 객체 지향 프로그래밍의 가장 큰 특징 중 하나인, 상속과 다형성을 활용한 구성이 가능할 수밖에 없다. 공식 문서를 읽어보기 전까지는 상속을 이용해 Entity를 구성해보겠다는 생각조차 한 적이 없었다. 그래서, 이번 글에서는 추상/일반 클래스를 상속해 Entity를 구성하는 법에 대해 간단하게 정리해보겠다.Entity Inheritance Entity는 Entity가 아닌 클래스, Entity인 클래스 모두 상속할 수 있다. 또 상속에 사용되는 Entity 클래스는 ..
서론지금 진행중인 프로젝트에서 마이크로서비스 아키텍처를 도입하기로 결정했습니다. 핀테크를 주제로 하는 만큼 결제, 조회 등 서비스에 필요한 중요한 기능들이 매우 밀접하게 맞물려 있는데, 저에게 익숙한 기존의 모놀리식 아키텍처가 아닌 마이크로서비스 아키텍처를 준비하게 되면서 여러 가지 발생할 수 있는 문제들에 대해 학습할 수 있었습니다.그 중 동시성 제어 문제가 가장 관심이 갔는데요, 오늘의 주제는 이 부분에 대해서 다루고자 합니다.비관적 락 VS 낙관적 락 비관적 락(Pessimistic Locking) 개념과 특징비관적 락은 데이터 충돌이 빈번하게 발생하는 환경에서 데이터 일관성을 유지하기 위해 유용하게 사용할 수 있습니다. 데이터에 대해 Lock을 미리 걸어 트랜잭션이 종료되어 명시적으로 Lock이 ..
서론 MSA(Microservice Architecture)의 기본적인 구현에 대해 공부하던 중, 다양한 응용 프로그램의 설정을 관리하는 프레임워크, Spring Cloud Config에 대해서 알게 되었다. 생소한 프레임워크이기도 하여, 이번 기회에 간단하게 정리해보고자 한다!Spring Cloud Config를 왜 써야할까? 나는 지금껏 단 하나의 어플리케이션을 이용한 서비스만 구현해 보았고, 그런 서비스에서는 어플리케이션의 설정을 관리하는 기능이나 시스템이 전혀 필요 없었다. 어차피 하나의 어플리케이션이니, 그 어플리케이션의 설정 파일만 건드리면 됐기 때문이다. 하지만 MSA같이 잘게 쪼개어진 여러 어플리케이션으로 이루어진 서비스를 운용해야 할 때, 그런 기능이 없다면 어떻게 될까? 각 어플리케이션..
동시성 이슈를 해결하는 방법은 여러가지가 있지만 이번에는 비관적 락, 낙관적 락, 분산 락으로 어떻게 해결하는지 코드와 함께 간단하게 정리해보았습니다!Pessimistic Lock 활용하기비관적 락(Pessimistic Lock)은 데이터의 일관성을 보장하기 위해 자주 사용하는 방법 중 하나입니다. 이 방법에서는 특정 데이터에 대한 Exclusive lock을 걸어, 다른 트랜잭션이 해당 데이터에 접근할 수 없도록 만듭니다. 쉽게 말해, 데이터를 가져가려면 먼저 내가 작업을 마칠 때까지 기다리라고 하는 것이죠.예를 들어, 아래의 코드처럼 JPA에서 @Lock 어노테이션을 활용해 비관적 락을 걸 수 있습니다.public interface StockRepository extends JpaRepository{..
안녕하세요, 이번에는 Spring MVC 기반의 애플리케이션에 동작하는 Spring Securtiy Architecure에 대해 정리를 해보려고 합니다. 본문은 https://docs.spring.io/spring-security/reference/servlet/architecture.html 을 기반으로 작성되었습니다.📌 Filter는 무엇인가?Spring Servlet에 대한 Spring Security의 지원은 Servlet Filter에 기반하고 있습니다. 따라서 Spring Security를 이해하기 위해서는 Spring MVC에서 필터가 어떻게 동작하는지 알고 있는 것이 중요합니다. 클라이언트가 애플리케이션에 요청을 보내면, Container(Servlet Container)는 요청 URI경..
언녕하세요 정만입니다~ @Bean과 @Component가 빈을 등록할 때 사용하는걸 알았지만 정확한 차이를 몰라 이번 기회에 정리해보았습니다. 💡 스프링 빈은 스프링 IoC(제어의 역전) 컨테이너가 생성하고 관리하는 객체로 애플리케이션의 구성 요소를 의미합니다. 스프링 IoC 컨테이너는 빈의 생명주기와 의존성을 관리하고 필요할 때 빈을 주입합니다. @Bean- 주로 @Configurartion이 붙은 클래스내에서 사용합니다.- 특정한 객체의 생성 로직이 필요할 때나 외부 라이브러리의 객체를 빈으로 등록할 때 사용합니다.- 주로 외부 라이브러리나 복잡한 초기화가 필요한 객체에 사용됩니다.- 메서드 레벨에서 수동으로 빈을 정의하고 등록합니다.@Configurationpublic class AppConfi..
이번 프로젝트 채팅을 통한 FCM 웹 알림 서비스를 진행했습니다. 지식 전파를 위해 포스팅합니다. FCM이란?FCM은 Firebase Cloud Messaging으로 메세지를 안정적으로 클라이언트 인스턴스에게 전송할 수 있는 교차 플랫폼 메시징 솔루션FCM은 교차 플랫폼 메시징 서비스이기 때문에 메세징을 클라이언트 플랫폼(Web, IOS, Android) 환경별로 개발 할 필요가 없어지므로 플랫폼에 종속되지 않고 메세지를 전송할 수 있어 구현의 복잡성을 낮춰준다.또한 만약 클라우드 메세징 서버 없이 서버 -> 클라이언트 메세지를 전송하는 구현부터 클라이언트가 계속해서 접속해야하기 때문에 네트워크 효율 문제가 발생한다. FCM의 구성요소와 작동원리FCM 작동에 필요한 두가지 주요 구성요소가 있다.Fireb..
서론우선 지금 진행중인 프로젝트에서 하나의 서비스에 두 개의 엔티티에 대해서 로그인을 진행해야 하는 상황이 생겼습니다.기존에 작성했던 회원 엔티티에 대해서는 로그인이 제대로 작동했지만 상담사 엔티티는 회원 엔티티가 다르게 작성되어 기존에 작성한 코드로는 상담사 로그인을 할 수 없었습니다.따라서 여러 방법을 시도하여 방법을 물색했고, 수 많은 에러를 본 후 결국 성공했던 방법을 공유하고자 합니다. 이러한 방법으로 해결은 할 수 있구나 하는 관점에서 봐주시면 감사하겠습니다.결론 (해결 방법)각각의 엔티티에 대한 @Configuration을 하나의 Security Config에 @Bean으로 등록한다. 이 과정에서 공통적으로 사용하는 PasswordEncoder 같은 bean들은 최상위에 한번만 정의합니다.@..