BackEnd/Spring Boot 24

Spring Boot + Prometheus + Grafana 모니터링 시스템 구축

Prometheus와 Grafana를 사용하여 Spring Boot와 연동하는 방법으로 모니터링 시스템을 구축하고자 한다. 모니터링 시스템이 필요한 이유CPU, 메모리, GC, 스레드, DB 커넥션 같은 주요 지표에 대한 적절한 알림 경고를 통해 버그, 장애가 발생한 상황을 인지할 수 있다.이를 통해 장애에 대한 빠른 대처가 가능하고, 안정적인 운영을 통해 비즈니스 신뢰성을 확보할 수 있다. 사용된 기술1. Spring Boot ActuatorSpring Boot Actuator는 Spring Boot 애플리케이션의 모니터링 및 관리를 용이하게 해주는 여러 기능을 제공하는 라이브러리이다. Actuator는 다음과 같은 기능을 제공한다.애플리케이션 건강 상태 확인메트릭 수집 및 시각화애플레케이션 환경 ..

BackEnd/Spring Boot 2025.09.24

Jsoup을 활용한 웹 크롤링

크롤링이란크롤링(crawling)이란 웹 페이지의 소스를 그대로 가져와서 그 안에서 원하는 데이터를 추출해 내는 행위이고, 이러한 과정을 수행하는 소프트웨어를 크롤러(Crawler)라고 한다. 인터넷 상의 방대한 양의 데이터를 빠르고 효율적으로 수집할 수 있기 때문에 크롤링은 매우 유용하게 활용된다. 크롤링을 통해 정적 데이터를 수집할 경우 데이터를 한번만 수집해와도 되지만 동적 데이터(ex 뉴스,주식 시세, 날씨...)를 수집해야하는 경우에는 주기적으로 크롤러를 실행하여 데이터베이스를 업데이트 해줘야 한다. 관련 라이브러리Python에서는 Beautiful Soup, Selenium등의 라이브러리가 사용되고, Java에서는 Jsoup을 통해 크롤링을 구현할 수 있다. Jsoup을 활용한 웹 크롤..

BackEnd/Spring Boot 2025.09.19

대용량 데이터 수집을 병렬 처리로 최적화하기

프로젝트를 진행하면서 고용24에서 제공하는 "내일배움카드 교육" 정보를 OPEN API로 호출하는 방법 대신 DB에 저장하여 조회하는 방식으로 변경하기 위해 모든 데이터를 저장을 해봤다. 국민내일배움카드 훈련과정 API는 총 3가지로 분류된다.훈련과정 목록훈련과정,기관 정보훈련일정훈련과정의 총 개수는 88366개이다. 모든 훈련과정을 저장하기 위해 훈련과정 목록을 저장했고 모든 지역의 훈련과정을 순차적으로 검색했을때 총 1시간 37분이 걸렸다. 이렇게 저장된 훈련과정 ID를 사용하여 훈련과정,기관정보, 훈련일정을 검색하기 위해서는 하나의 훈련 ID당 두번의 API호출이 필요했다.즉, 상세정보를 저장하기 위한 총 조회 횟수는 16만번 이상이 된다. 88366개의 데이터를 순차적으로 돌면서 상세정보를 수집하..

BackEnd/Spring Boot 2025.09.15

CORS란? Spring Boot에서 CORS 정책 설정

Origin이란?Origin은 출처를 의미한다. URL에서 Protocol, Host, Port가 같으면 동일한 Origin임을 의미한다. SOP(Same Origin Policy)만약 Origin이 다른 두 애플리케이션이 자유롭게 소통할 수 있게되면 보안상 치명적인 문제가 생길 수 있다.XSS(크로스 사이트 스크립팅), CSRF(사이트 요청 위조) 공격에 취약해질 수 있다. 따라서 같은 Origin만 끼리만 리소스를 공유할 수 있는 정책이 필요하다. 이 정책을 SOP(Same Origin Policy)라고 부른다. 하지만 다른 Origin에서의 요청을 허용해줘야 하는 경우도 존재한다.예를 들면 프론트엔드 서버에서 백엔드 서버로 요청을 보낼 경우 이 요청을 막아버린다면, 프론트엔드와 백엔드간 통신이 불가..

BackEnd/Spring Boot 2025.08.22

WebSocket + STOMP로 채팅 구현하기

STOMP란?Simple Text Oriented Messaging Protocol의 약자로 메시지를 전송하기 위한 프로토콜이다.메시지 브로커와 publisher - subscriber 방식을 사용하고, 메시지 브로커는 발행자가 전송하는 메시지를 구독자들에게 전송한다. 왜 STOMP를 사용 했는가?Spring WebSocket은 단순히 양방향 연결 채널일 뿐, 메시지를 어디로, 누가, 무엇을 보내는지 구조적으로 정의되어있지 않다. 하지만 STOMP를 WebSocket위에서 동작시키면 채널 구독, 메시지 목적지(채팅방) 구분, 구독 관리 등 실시간 채팅에 맞는 다양한 기능을 사용 가능하다. 따라서 이번에 구현한 채팅은 WebSocket 위에서 STOMP를 사용하여 채팅방 생성, 채팅방 구독, 전송, 읽..

BackEnd/Spring Boot 2025.05.30

Spring Webocket을 이용한 실시간 채팅 구현(+ JWT 인증)

GitHub - yangwoohyeon/OAuth2_9oormthonUNIVContribute to yangwoohyeon/OAuth2_9oormthonUNIV development by creating an account on GitHub.github.com WebSocket이란?서버와 클라이언트 간에 Socket Connection을 유지해서 언제든 양방향 통신 또는 데이터 전송이 가능하도록 하는 기술로써, sns, 화상 채팅, 증권 거래 등에서 널리 사용되고 있다. 왜 WebSocket을 사용하는가? HTTP를 사용하여 실시간 양방향 통신을 구현하기 위해서는 다음과 같은 방법을 사용할 수 있다. 백엔드에서 변경 사항이 생길 때마다 프론트엔드에게 응답을 보내주는 방식 : Server-Sent-Eve..

BackEnd/Spring Boot 2025.05.14

@Controller와 @RestController의 차이점

스프링 MVC에서 빠질 수 없는 애노테이션이 바로 @Controller이다. @Controller는 주로 HTML과 같은 뷰를 렌더링 할때 사용된다. @Controllerpublic class MyController { @RequestMapping("/greeting") public String greeting(Model model) { model.addAttribute("message", "Hello, World!"); return "greeting"; // greeting.jsp 또는 greeting.html과 같이 뷰를 찾아 렌더링 } }  하지만 뷰를 렌더링하는것 이 아닌 Data(또는 객체)를 반환해야 하는 경우도 존재한다. 이럴때는 @Respons..

BackEnd/Spring Boot 2025.02.23

SpringBean

스프링 빈이란 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다.즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈(Bean)을 관리한다.  스프링 빈(Bean)의 필요성 스프링빈을 사용하는 이유는 크게 객체 관리의 효율성, 의존성 주입(DI), 객체의 생명주기 관리, 애플리케이션의 유지보수성 향상 때문이다. 1. 객체 생성을 자동으로 관리해준다. 스프링을 사용하지 않은 경우public class Main { public static void main(String[] args) { MyService myService = new MyService(); System.out.println(myService.getMessage()); }}..

BackEnd/Spring Boot 2025.02.11

회원가입 로그인 구현

우선 맴버를 정의 해준다( 로그인 아이디, 패스워드를 가짐)package hello.login.domain.member;import lombok.Data;import javax.validation.constraints.NotEmpty;@Datapublic class Member { private Long id; @NotEmpty private String loginId; //로그인 아이디 @NotEmpty private String name; @NotEmpty private String password;}@NotEmpty를 넣어 줌으로써 아이디 비밀번호의 공백을 방지해준다.  @Controller@RequiredArg..

BackEnd/Spring Boot 2024.08.19

BeanValidation-Form 전송 객체 분리

검증시 등록할때의 객체와 수정할때의 객체가 다르면 groups를 이용하여 데이터를 검증하기가 어려워진다. 간단한 프로젝트를 통해 이해할 수 있었다. 프로젝트 요구사항Item 등록시 1) 상품이름 = NULL(X)2) 가격 = 1000이상, 1000000이하, NULL(X)3) 상품 수량 = 최대 9999 Item 수정시1) 상품id = NULL(X)2) 상품이름 = NULL(X)3) 가격 = 1000이상, 1000000이하, NULL(X)4) 상품수량 = 수정할때는 수량의 제한이 없음  이러한 제한사항을 구현하기 위해 Form 전송 객체를 분리 하였다.  - 상품 등록 시 사용package hello.itemservice.web.validation.form;import lombok.Data;import ..

BackEnd/Spring Boot 2024.08.05