분류 전체보기
-
Q. 1637 자바 : 날카로운 눈코딩테스트/백준_Java 2025. 3. 2. 23:32
Q. 1637 자바 : 날카로운 눈 문제 : boj.kr/1637P4 난이도의 문제이다. 문제를 간단히 설명하자면 n개의 입력이 주어지고 입력마다 a, c, b가 주어진다.각각의 입력에 대해 a, a + b, ... a+kb(a + kb 특정한 정수 하나만 홀수개 존재한다면 그 정수와 몇개 존재하는지를 구하는 문제이다. 예를들어 아래와 같이 입력이 주어졌다면41 10 14 4 11 5 16 10 1첫 번째 입력은 1, 2, 3, 4, 5, 6, 7, 8, 9, 10의 정수 더미를두 번째 입력은 4세 번째는 1, 2, 3, 4, 5네 번째는 6, 7, 8, 9, 10을 의미한다. 이를 모두 합치면 정수 4가 3개 존재하므로 4 3을 출력하면 된다.먼저 완전 탐색 방식으로 푼다고 가정하면 아래와 같이 풀었을..
-
쿠버네티스란?개발/기타 2025. 2. 23. 23:08
"k8s라고도 알려진 쿠버네티스는 컨테이너화된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템" Docs에 작성돼 있다. 이 설명만 봐도 용어가 너무 많으므로 1. 용어에 대한 의미(컨테이너와 애플리케이션, 배포 및 스케일링)와2. 쿠버네티스에 대한 내용3. 쿠버네티스에서 사용하는 용어순서로 각각의 용어들과 함께 쿠버네티스에 대해 간단히 작성해보고자 한다.1. 용어에 대한 의미1) 컨테이너와 애플리케이션 컨테이너는애플리케이션과 그 실행에 필요한 모든 요소(코드, 라이브러리, 설정 등)를 하나의 패키지로 묶어 격리된 환경에서 실행할 수 있도록 해주는 기술이다. 여기서 애플리케이션은 내가 주로 사용하는 스프링부트로 예시를 들 수 있다.그리고 애플리케이션을 컨테이너로 만들어주는 도구로는..
-
SSE를 활용해 작업 진행률 전달하기개발/Spring(boot) 2025. 2. 16. 23:59
서버에서 특정 작업이 오래 걸릴 수 있고, 이 경우 클라이언트에게 진행률을 알려주는것이 UX 관점에서 좋다고 생각한다.그럼 서버가 클라이언트에게 작업 진행률을 어떻게 전달할 수 있는지에 대해 작성해보겠다. 그래서 이번 글에서는 Springboot의 WebFlux를 활용해 이를 전달하는 방법에 대해0. WebFlux 선택 이유1. 초기 환경 세팅2. SSE 코드 작성3. SSE와 WebSocket 통신의 차이4. 내가 작성한 SSE의 한계점순서로 작성해보고자 한다.0. WebFlux 선택 이유SSE를 사용하는 방법은 크게 두가지가 있다.1) ResponseBodyEmitter를 사용하는 방법 (Spring MVC 기반)2) WebFlux의 Flux를 사용하는 방법 (Reactive Streams 기반) 그..
-
Springboot에서 ChatGpt연동하기개발/Spring(boot) 2025. 2. 9. 22:49
Springboot에서 외부 Api(ChatGpt)를 연동한 프로젝트를 만드는 방법에 대해 작성해보고자 한다. 1. 프로젝트 초기 환경 세팅2. OpenAI Docs를 보고 FeignClient를 활용해 Api 호출을 하여 사용하는 방법3. SpringAI를 사용해 연동하는 방법순서로 작성하겠다.0. OpenAi Api key 발급Chat GPT API 호출은 유료이다.먼저 외부 Api를 연동하기 위해서는 Api key 발급이 필요하다.https://platform.openai.com/api-keys 위 url에 들어가서 로그인(회원가입)을 한 뒤에 Create Api Key 버튼을 클릭한다.발급된 Api key는 다시 볼 수 없는 것 같아서 어딘가에 저장해 놓는 것을 추천한다. 1. 프로젝트 초기 환경..
-
Q. 5719 자바 : 거의 최단 경로코딩테스트/백준_Java 2025. 1. 26. 23:47
Q. 5719자바 : 거의 최단 경로 문제 : boj.kr/5719P5 난이도의 문제이다. 문제를 간단히 설명하자면 거의 최단 경로를 찾는 문제이고거의 최단 경로란 최단 경로에 포함되지 않는 도로로만 이루어진 경로 중 가장 짧은 것을 말한다. 거의 최단 경로를 찾기 위해서는 먼저 최단 경로를 찾아야 한다.그리고 경로 추적을 이용해 어떤 간선을 통해 최단 경로에 도달했는지 파악하고 해당 간선들을 끊어준 뒤다시 최단 경로를 계산하면 거의 최단 경로를 구할 수 있다.아래와 같은 방식으로 풀었다. 0. 입력값에 대해 정방향 그래프와 더불어 역방향 그래프를 저장한다.1. 시작점으로 부터 정방향 그래프와 다익스트라 알고리즘을 활용해 최단 경로를 계산한다.2. 도착점에서 역방향 그래프와 BFS를 활용해 어떤 간선이..
-
Custom Annotation을 만들고 AOP로 활용하는 법개발/Spring(boot) 2025. 1. 19. 23:53
이전 글을 읽고 보면 이해가 더 쉬울 것 같습니다. Spring Security 인가(Authorization)를 공부하다 보면 아래와 같은 코드를 마주치게 된다.@Componentpublic class BankService { @PreAuthorize("hasRole('ADMIN')") public Account readAccount(Long id) { // ... is only invoked if the `Authentication` has the `ROLE_ADMIN` authority }}"ADMIN" 권한이 있는 유저만 해당 메서드 또는 api에 접근할 수 있도록 통제하는 것 이다. 근데 AOP를 공부하다 보니 나만의 @PreAuthorize를 만들 수 있을 것 같았고이번 글은 나만..
-
@Transactional을 final class에 붙이면 안되는 이유(AOP의 동작원리)개발/Spring(boot) 2025. 1. 12. 23:06
업무를 하던 도중 for문을 돌며 데이터를 DB에 넣어주는 코드를 발견했다.그리고 데이터를 저장하는 연산이라 for문을 호출하는 메서드에 @Transactional을 붙여야 할 것 같아 해당 내용을 검토를 받고 어노테이션을 붙여주고자 했다.하지만 그 코드에 @Transactional을 붙이자 스프링부트 앱이 실행이 안되는 현상이 발생했다. 결론적으로 원인은 final class에 @Transactional을 붙여서 생긴 문제였고,final class에 @Transactional을 붙이면 안되는 이유는 아래와 같았다.1. @Transactional은 Spring AOP를 기반으로 동작하고, 2. AOP는 CGLIB Proxy를 생성하는 것 기반으로 동작한다.3. 추가적으로 @Transactional을 붙..
-
스프링의 DB 관련 예외 추상화개발/Spring(boot) 2025. 1. 5. 22:15
이번엔 DB의 예외를 다루면서 기술에 종속된다는 한계점을 겪고 좀 더 나은 방법에 대해 고민해보던 도중예외 추상화라는 키워드를 찾아 해당 내용에 대해 작성해보려 한다. 먼저 어떤 과정에서 해당 내용을 찾게 되었는지 간략하게 작성해보자면 아래와 같다. 업무를 하던 도중 정상적인 요청에 대해서도 Unique key 제약조건이 순간적으로 깨질 수 있는 상황이 발생했다. 예를들어 유저의 이름이 Unique할 때 여러 명의 유저 이름을 동시에 변경하려고 하면 문제가 생겼었다. 그래서 아래와 같은 방식으로 해결하면서 일시적으로 해결했다.// 1. 더미 데이터로 이름 변경private void setDummy(List updateDummeyUsers) { for (User user : updateDummeyUs..