전체 글 51

스프링 싱글톤 컨테이너의 의존관계 주입과 빈 생명주기

🚩목차 스프링 컨테이너와 스프링 빈스프링 컨테이너란 스프링 컨테이너란 스프링 빈(객체)을 싱글톤 패턴으로 생성하고 관리하는 저장 공간입니다. 객체를 싱글톤 패턴으로 관리한다는 말은 스프링 애플리케이션 내에서 해당 클래스 인스턴스를 단 하나만 생성해서 여러 컴포넌트에서 재활용 한다는 의미입니다. 스프링 컨테이너는 BeanFactory 인터페이스를 의미합니다. getBean()으로 저장소에 등록된 빈을 가져오거나, getType()으로 빈 타입을 확인하는 등 다양한 메소드를 제공합니다. 현대에는 BeanFactory를 구현해 다양한 기능을 추가 탑재한 ApplicationContext 인터페이스를 스프링 컨테이너로 주로 사용합니다. 빈 수동 등록 ApplicationContext는 저장소에 등록할 스프링 빈..

개발/Spring 2024.05.16

Springboot로 Web Socket 상에서 STOMP 메시지 브로커 적용하기

개요 지난 포스팅에서는 특정 URL로 전달되는 웹소켓 요청을 처리하는 웹소켓 핸들러를 구현했습니다. 웹소켓 핸들러 내부에 컨커런트 해시맵 자료구조를 두고, 웹소켓 연결이 체결된 클라이언트의 세션을 관리했습니다. 하지만 이 방식은 다음의 단점이 존재했습니다. URL(채팅방) 마다 웹소켓 요청을 처리할 웹소켓 핸들러를 구현해 매핑해야 한다.메시지 인식에 문제가 없도록 클라이언트와 서버 간 전달할 데이터 형식을 정해야 한다.메시지를 전달하기 위한 웹소켓 세션 관리 로직(메시지 채널링)을 개발자가 직접 작성해야 한다.  이번 포스팅에서는 스프링이 제공하는 내장 심플 메시지 브로커를 사용해 1,2,3번 모두 해결해 보겠습니다. 그전에 Simple Message Broker는 STOMP 메시징 프로토콜을 사용하므로..

개발/프로젝트 2024.05.11

Springboot 프로젝트에서 Jasypt 암호화로 yml 설정 파일 프로퍼티 관리하기

🚩목차개요 스프링부트 프로젝트 내 application.yml application.properties 등 프로젝트 설정 파일을 관리하다 보면, 외부에 노출되어서는 안되는 값들이 생기기 마련입니다. 설정 파일 프로퍼티를 노출하지 않는 방법은 다양하지만 이번 포스팅에서는 Jasypt 암호화를 다루고자 합니다. Jasypt 라이브러리Jasypt 란? Jasypt는 Java Simplified Encryption의 약자로, 암호화 지식 없이도 자바 애플리케이션에 암호화 기능을 쉽게 추가할 수 있도록 도와주는 라이브러리입니다. dependency를 추가하고 Configuration 클래스만 작성하면 간단히 사용할 수 있습니다. Jasypt 적용하기1. dependencyhttps://mvnrepository...

개발/Spring 2024.05.07

[AWS] S3 이미지 업로드 후 URL 접근 시 Access Denied 해결

문제 AWS S3 버킷에 이미지를 업로드한 후 url로 접근 시 Access Denied 문제가 발생했습니다. 프론트엔드에서 url로 이미지 리소스에 접근해야하기 때문에 문제를 해결해야만 했습니다. 해결 방법S3 버킷 화면에서 권한 탭을 누릅니다. 퍼블릭 액세스 차단 편집 버튼을 누른 뒤, 위 화면에서 체크를 비활성화하고 변경사항 저장을 누릅니다. 다시 권한 탭으로 돌아가 버킷 정책 편집 버튼을 누릅니다. 아래 json 코드를 복사 붙여넣기 한 뒤 Resource 키의 밸류로 버킷의 arn을 작성합니다. { "Version":"2012-10-17", "Statement":[{ "Sid":"PublicReadGetObject", "Effect":"Allow", "Principal": "..

Springboot로 Web Socket 서버 구축하기

개요 일반적인 채팅 애플리케이션은 상대방이 나에게 메시지를 전송하면, 내 화면에 즉시 메시지가 표시됩니다. HTTP 통신은 클라이언트와 서버 간 요청과 응답이 완료되면 연결을 끊어버리기 때문에, 상대방이 메시지를 전송했는지 안 했는지 알기 위해서는 새로고침을 해야만 합니다.  하지만 나에게 신규 메시지가 전송될 때마다 새로고침 하는 것은 우리가 원하는 방법이 아닐 겁니다. 이 문제를 해결하기 위해 사용할 수 있는 프로토콜은 바로 Web Socket인데요, 왜 그런지 살펴보도록 하겠습니다. Web Socket 특징 2가지 HTTP 통신과 비교했을 때 WebSocket 통신에서 두드러지는 특징이 2가지가 있습니다. 첫째, 클라이언트와 서버가 TCP 3-way 핸드셰이크로 연결을 체결한 후, 해당 연결을 끊지..

개발/프로젝트 2024.05.02

Web3j 라이브러리를 활용한 이더리움 통신 Spring boot 프로젝트

개요 최근 블록체인 기술에 흥미가 생겼다. 빠르게 블록체인 생태계를 경험해보고 싶어 DApp을 개발해보려 한다. 흔히 DApp은 Truffle, Hardhat 프레임워크 상에서 Solidity 언어로 Smart Contract를 작성하고 배포한 뒤, 자바스크립트 라이브러리 web3.js를 통해 스마트 컨트랙트를 호출하여 동작한다.  하지만 이번 프로젝트는 블록체인 생태계에 대한 빠른 이해를 위해 진행하는 것이다. 따라서 Java 백엔드 개발을 해왔던 나에게 있어 개발 편의성 및 효율성을 따져, Web3j 라는 자바 진영 이더리움 라이브러리를 사용해보았다. 다음 프로젝트에서 Smart Contract를 작성해 Klaytn 블록체인의 Baobab 테스트넷에 배포하고, web3.js 자바스크립트 라이브러리로 ..

개발/프로젝트 2024.04.25

GitHub Actions Workflow yml 파일 구성요소

개요 GitHub Actions으로 CI/CD 파이프라인을 구축하며 ”워크플로우 파일을 작성하기 전 미리 알았더라면 좋았겠다“ 라고 생각한 핵심 구성 요소들을 정리해 보았다. Workflow 구성 요소들을 학습하고 나면 yml 파일 흐름이 눈에 들어올 것이다! GitHub ActionsWhat 우선, CI/CD란 무엇일까? 한국어로 번역하면 지속적 통합, 지속적 배포다. 코드 수정사항을 운영 환경에 통합해 배포하는 것을 의미한다. 깃헙 액션은 CI/CD 파이프라인을 구축할 때 사용할 수 있는 플랫폼 중 하나다. GitHub Actions 외에도 Jenkins, Travis CI, Google Cloud Build 등을 활용할 수 있다. Why CI/CD 툴을 활용해 자동 통합, 배포를 하는 것을 알았다...

개발/Git 2024.04.17

서블릿과 서블릿 컨테이너란 무엇이고 어떻게 동작할까? - 전통적인 웹 앱 부터 Spring MVC까지 (1)

개요 자바 스프링 웹 백엔드 개발자를 희망하는 사람이라면, 스프링 웹 프레임워크(Spring MVC)가 서블릿 기반으로 동작한다고 한 번쯤은 들어봤을 것이다. 그런데 서블릿이 뭘까? 스프링 MVC가 내장하고 있다는 톰캣 웹 서버는 또 무엇일까? 이번 시리즈에서는 다음과 같은 궁금증을 풀어보려 한다. 서블릿과 서블릿 컨테이너는 무엇일까? 왜 사용될까? (📍현재 포스팅) Spring MVC에서 서블릿 컨테이너의 동작 방식은 어떠할까? (🔗보러가기) 서블릿 컨테이너와 스프링 컨테이너의 차이점은 무엇일까? (🔗보러가기) 서블릿과 서블릿 컨테이너 우선, 전통적인 웹 애플리케이션에서의 서블릿과 서블릿 컨테이너에 대해 알아보도록 하자. (스프링 MVC 스펙 말고!) What Servlet은 자바 웹 애플리케이션에서 ..

개발/Spring 2024.04.16

정적 팩토리 메서드 Static Factory Method

What 정적 팩토리 메서드란? 클래스의 인스턴스를 반환하는 단순한 정적 메서드다. 클래스는 클라이언트에 public 생성자 외에도 정적 팩토리 메서드를 제공할 수 있다. 팩토리 메서드 디자인 패턴과는 전혀 관련 없는 개념이니 혼동하지 않도록 주의하자. Why 장점 - 왜 사용하는가? 1. 이름을 가질 수 있다. Human(String name, int height) Human(String name, int weight) // 불가능, 위와 동일한 생성자 시그니처 Human(int weight, String name) // 가능, but 의미를 알 수 없음 동일한 시그니처로는 생성자를 단 하나만 만들 수 있다. 순서를 변경해 다른 시그니처로 만들 수 있지만, 개발자는 앞에오는 int 매개변수가 heigh..

개발/Java 2024.04.11

Spring Security 인터페이스를 활용한 Rest API 로그인 인증 구현

개요 이번 교내 팀 프로젝트에서 Spring Security를 확실하게 짚고 가고자 회원관리를 담당했습니다. Spring Sedurity를 활용해 기본 제공 FORM 로그인이 아닌 REST API로 로그인 인증을 구현했습니다. 이 포스팅을 통해 Security의 인증 핵심 인터페이스를 어떻게 구현했는지 복기하려 합니다. Spring Security 인증 절차 & 핵심 인터페이스 포스팅을 함께 보시는 것을 추천 드립니다. Spring Security 인증 핵심 인터페이스인증 처리의 핵심 인터페이스 다섯 가지를 소개합니다.AbstractAuthenticationProcessingFilter: 인증 처리의 시작점AuthenticationProvider: 실질적인 인증 처리를 담당Authentic..

개발/Spring 2024.03.31