반응형

Programming 38

[Part 1] Spring 패키지 구조 설계 전략: MVC vs 도메인 중심

Spring 프로젝트를 시작할 때 가장 먼저 마주하는 선택지 중 하나가 “패키지 구조를 어떻게 나눌 것인가?”입니다.많은 분들이 controller, service, repository처럼 계층 중심 구조(MVC 기반)로 시작하지만,실무에서는 도메인 중심 구조로 점차 옮겨가는 추세입니다.이번 글에서는 두 구조의 차이점, 장단점, 선택 기준을 구체적인 예시와 함께 정리해보았습니다.📌 구조 비교: MVC vs 도메인 중심항목MVC 패턴 기반 구조도메인 중심 구조기준역할 계층별(controller, service, repository)도메인 기능별(user, product, order)장점역할 분리가 명확익숙한 구조응집도 높음모듈화 용이협업에 유리단점같은 도메인의 코드가 분산됨초보자에게 익숙하지 않을 수 있..

Programming/Spring 2025.07.14

Spring 트랜잭션에서 `@Transactional`이 무시되는 이유와 주의할 점

Spring에서는 @Transactional을 이용해 트랜잭션을 손쉽게 적용할 수 있지만, 프록시 기반이라는 특성 때문에 내부 메소드 호출 시 트랜잭션이 적용되지 않는 문제(self-invocation) 가 발생할 수 있습니다.이 글에서는 다음 세 가지 핵심 내용을 다룹니다:@Transactional은 프록시 객체를 통해 트랜잭션을 제어자기 호출(self-invocation) 은 프록시를 우회하므로 트랜잭션이 무시됨트랜잭션이 적용되지 않으면 어떤 일이 발생하는지1. @Transactional은 프록시를 통해 트랜잭션을 제어Spring은 @Transactional을 감지해 실제 객체가 아닌 프록시 객체를 생성합니다. 이 프록시가 트랜잭션을 시작하고, 메소드 실행 후 커밋 또는 롤백합니다.@Servicepu..

Programming/Spring 2025.07.14

[Spring Boot] JPA vs Querydsl - 동적 쿼리 필터링 어떻게 다를까?

Spring Boot에서 JPA를 쓰다 보면 동적 조건이 있는 검색 API를 구현할 일이 많습니다. 이때 JPA만으로 구현했을 때와 Querydsl을 함께 사용했을 때의 차이를 실제 코드로 비교해보며, 실무에서 왜 Querydsl을 많이 쓰는지 살펴보겠습니다.💡 시나리오: 조건부 사용자 검색아래 조건들을 입력받아 사용자(User)를 검색하는 API를 만든다고 가정합니다.이름(name)은 포함 검색 (LIKE)나이(age)는 이상 조건 (greater than or equal)가입일(createdAt)은 이후 날짜부터 검색 (after)세 조건은 모두 선택적으로 들어올 수 있습니다.🔸 JPA만 사용할 때 (Criteria API 사용)public List searchUsers(String name, I..

Programming/Spring 2025.07.14

[프로그래머스] 순위 문제 - 플로이드 워셜 알고리즘으로 해결하기

이 글에서는 프로그래머스 문제 순위를 Floyd-Warshall 알고리즘을 사용해 해결하는 과정을 설명합니다.🔍 문제 요약선수들 간의 경기 결과가 주어짐 (예: A가 B를 이김)이긴 사람과 진 사람 간의 관계를 이용해 정확한 순위를 알 수 있는 선수의 수를 구해야 함정확한 순위란? → 해당 선수가 다른 모든 선수들과 승패 관계가 확정되어 있을 때✅ 아이디어: Floyd-WarshallFloyd-Warshall 알고리즘은 모든 정점 쌍 사이의 최단 거리 또는 연결 관계를 계산할 때 사용됩니다.이 문제에서는 간접적인 승패 관계까지 전파하는 데 매우 적합합니다.관계 표현 방식관계값i가 j를 이김1i가 j에게 짐-1모름0🧠 알고리즘 구조for k in range(1, n + 1): # 중간 노드 ..

프로그래머스 문제 풀이: 리코쳇 로봇 (169199)

문제 링크 → 프로그래머스✨ 핵심 아이디어시작 지점에서 목표 지점까지 가장 빠른 경로를 구하는 최단 거리 문제일반적인 상하좌우 이동이 아닌, 장애물이나 벽에 닿을 때까지 미끄러지듯 이동따라서 BFS (너비 우선 탐색) 을 활용하여 최소 이동 횟수를 계산함🔧 알고리즘 전략1. 보드 분석"R": 시작 위치 (Robot)"G": 목표 위치 (Goal)"D": 장애물 (Dead zone)2. BFS (너비 우선 탐색)큐에 현재 위치와 이동 횟수를 저장 (h, w, depth)상하좌우 네 방향으로 이동 시, 장애물이나 벽에 닿을 때까지 이동이동이 끝나는 좌표가 visited에 없다면 큐에 추가💡 개선 포인트✅ 중복 코드 제거"U", "D", "L", "R"을 각각 처리하지 않고, 방향 벡터로 일반화direct..

[프로그래머스] 이모티콘 할인행사 - 백트래킹 + 가지치기 풀이

🏝️ 문제 개요문제 링크: 프로그래머스 - 이모티콘 할인행사문제 요약:maps라는 문자열 2차원 배열에서 'X'가 아닌 숫자들은 음식량을 의미하며, 상하좌우로 연결된 땅 덩어리(무인도)를 찾아 음식 총합을 구한 후 오름차순으로 정렬하는 문제.❓ 문제 요약각 유저는 할인율 기준과 이모티콘 플러스 가입 기준 금액을 가짐이모티콘마다 할인율을 10%, 20%, 30%, 40% 중 하나로 정해야 함목표는:이모티콘 플러스 가입자를 최대화동일한 수일 경우, 이모티콘 판매액을 최대화🧠 접근 방법기본적으로는 할인율 조합을 모두 탐색해야 함 → 4ⁿ 조합하지만:이모티콘 수가 많아지면 조합 수가 급격히 증가itertools.product로는 모든 조합을 한 번에 생성하기 때문에 최적화 불가따라서 재귀(DFS) + 가지치..

프로그래머스 무인도 여행 문제풀이 - DFS 재귀에서 런타임 에러가 난 이유

Python DFS 재귀 방식으로 접근했다가 RecursionError를 경험하고, return 기반 방식으로 개선한 기록입니다.🏝️ 문제 개요문제 링크: 프로그래머스 - 무인도 여행문제 요약:maps라는 문자열 2차원 배열에서 'X'가 아닌 숫자들은 음식량을 의미하며, 상하좌우로 연결된 땅 덩어리(무인도)를 찾아 음식 총합을 구한 후 오름차순으로 정렬하는 문제.🧪 [프로그래머스 무인도 여행] 첫 시도 - Python 재귀 DFS처음엔 DFS로 연결된 지점을 탐색해 음식량을 누적하려고 했습니다.이때 숫자 누적이 잘 안 돼서 temp_list라는 전역 리스트를 써서 처리했어요.import syssys.setrecursionlimit(10 ** 6)def solution(maps): directio..

반응형