분류 전체보기
-
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..
-
25년 계획 및 23~24년 회고개발/기타 2024. 12. 29. 17:53
25년 목표는 아래와 같다.1. 개인으로서 목표사놓고 읽지 못한 개발서적들이 있고 연말에 읽기위해 분철을 해 두었다. 다 읽는 것이 목표이다. 자바 ORM 표준 JPA 프로그래밍운영체제(공룡책) 오브젝트Head First Design Pattern인프런에 아직 듣지 못한 강의 역시 다 듣는 것이 목표이다.토비의 스프링김영한의 실전 자바실전 QueryDsl기타 자바 관련 강의들코틀린 공부기존 코틀린 앱 개발 경험을 살려 코틀린에 대해 개인적으로 공부를 해보고자 한다.고민중인 내용백엔드/안드로이드 둘 다 맡아 앱 개발을 하나 해볼 예정이다.회사 내 JAVA 코드를 혼자서 개인공부 용도로 코틀린으로 전환해볼까 고민중이다.이 과정에서 Kotlin JDSL을 사용해보고 해당 오픈소스에 기여해보는 것이 목표이다.(..
-
ApplicationEventPublisher와 EventListener개발/Spring(boot) 2024. 12. 1. 16:30
ApplicationEventPublisher와 EventListener에 대해 궁금해져서 해당 내용에 대해 조금 더 알아보고 작성해보고자 한다. 먼저 알아보기 전 예시 코드를 보고 추측해봤던 두 코드의 기능은 다음과 같다.1. ApplicationEventPublisher는 이벤트를 Publish하고 그 이후에 행동에는 책임을 지지 않는다.2. EventListener는 원하는 이벤트가 발생했을 때 해당 이벤트를 감지하고 이후 비즈니스 로직을 처리한다. 여기까지가 추측했던 동작 방식이고 이제부터는는 실제로 해당 기능을 찾아보며 조금 더 구체적이고 새롭게 알게된 내용을 작성해보고자 한다.ApplicationEventPublisher의 내부 구조는 다음과 같다.@FunctionalInterfacepubli..
-
99클럽 코테 스터디 36일차 TIL + 돌 게임(백준)Study(진행중)/항해99 2024. 8. 27. 01:05
오늘의 학습 키워드 - 알고리즘공부한 내용 본인의 언어로 정리하기https://www.acmicpc.net/problem/9655아이디어를 이용해 푸는 문제였다. 풀이 과정은 다음과 같다.1. 돌이 1개라면 상근이가 무조건 이긴다.2. 돌이 2개라면 창영이가 무조건 이긴다.3. 돌이 3개라면 상근이가 무조건 이긴다.4. 돌이 4개라면 상근이가 1개를 가져가면 3번으로, 3개를 가져가면 1번으로 가므로 창영이가 무조건 이긴다.5. 돌이 5개라면 상근이가 1개를 가져가면 4번으로, 3개를 가져가면2번으로 가므로 상근이가 무조건 이긴다.2n-1. 돌이 2n-1개라면 상근이가 무조건 이긴다2n. 돌이 2n개라면 창영이가 무조건 이긴다. 라는 점화식으로 풀었다.풀이는 다음과 같다.import java.util..
-
99클럽 코테 스터디 35일차 TIL + 표 병합(프로그래머스)Study(진행중)/항해99 2024. 8. 26. 00:16
오늘의 학습 키워드 - 구현 - union-find공부한 내용 본인의 언어로 정리하기https://school.programmers.co.kr/learn/courses/30/lessons/150366여러 구현 방법이 있겠지만, union-find를 활용한 문제를 풀었따. 풀이 과정은 다음과 같다.1. UPDATE r c value- r행c열의 부모를 find 연산으로 찾은 뒤 update 2. UPDATE value1 value2- 모든 셀을 돌며 value1과 동일한 값들을 value2로 변경 3. MERGE r1 c1 r2 c2- r1, c1의 부모와 r2 c2의 부모를 find 연산으로 찾은 뒤 union(r1c1, r2c2) 4. UNMERGE r c- r c의 부모를 find 연산으로 찾..
-
99클럽 코테 스터디 34일차 TIL / 여행 경로(프로그래머스)Study(진행중)/항해99 2024. 8. 25. 02:26
오늘의 학습 키워드 - 알고리즘 - 구현 - dfs공부한 내용 본인의 언어로 정리하기https://school.programmers.co.kr/learn/courses/30/lessons/43164조금 까다롭게 문자열을 다뤄야 하는 dfs 문제를 풀었다. 풀이 과정은 다음과 같다.1. 티켓을 모두 사용해야 하므로 dfs에서 방문 처리는 티켓의 인덱스로 사용2. dfs 로직을 돌며 만약 깊이가 티켓과 동일하다면 해당 여행 경로를 list에 추가3. 알파벳 순으로 가장 먼저 나오는 경로를 사용해야 하므로 리스트를 정렬하여 0번째 인덱스 값 반환 풀이는 다음과 같다.import java.util.*;class Solution { int ticketLen; String[][] tic..