Spring DI란? 주입 방식의 종류와 기본 개념
·
Programming/Spring
Spring에서 가장 중요한 개념 중 하나인 DI(Dependency Injection, 의존성 주입)은 객체 간의 의존 관계를 외부에서 주입해주는 방식입니다. 이 글에서는 DI가 무엇인지, 그리고 어떤 방식으로 의존성을 주입할 수 있는지 정리해보겠습니다.✅ 의존성 주입(DI)이란?객체 간의 협업이 필요할 때, 직접 객체를 생성하지 않고 외부에서 주입받는 방식입니다.Spring에서는 DI를 통해 객체 간 결합도를 낮추고, 테스트 및 유지보수를 용이하게 만듭니다.예: UserService가 UserRepository를 필요로 할 때 직접 생성하지 않고 외부에서 주입받음💡 DI 방식의 종류Spring에서는 의존성 주입을 다음과 같은 방식으로 지원합니다:1. 필드 주입 (Field Injection)@Com..
프로그래머스 괄호 문제 풀이: 스택으로 푸는 방법
·
Programming/코딩 테스트
괄호 문자열의 유효성을 검사하는 문제는 자료구조 중 하나인 스택(Stack)을 이해하는 데 아주 좋은 예시입니다. 이번 글에서는 프로그래머스의 "올바른 괄호" 문제를 스택으로 해결하는 방법과, 코드 최적화 아이디어를 함께 정리해보겠습니다.👉 문제 링크: 프로그래머스 - 올바른 괄호🧠 문제 요약주어진 문자열 s는 괄호로만 구성되어 있습니다. 괄호가 짝지어 올바르게 구성되어 있는지 판별하는 함수를 작성해야 합니다.예시 1: "()()" → True예시 2: "(())()" → True예시 3: ")()(" → False예시 4: "(()(" → False✅ 핵심 아이디어: 스택여는 괄호 ("를 만나면 스택에 push닫는 괄호 ")"를 만나면 스택에서 pop단, 스택이 비어있다면 → 잘못된 괄호 → Fal..
[Part 2] JPA 실전 설계 전략: DTO, Entity, VO, Projection 구분법
·
Programming/Spring
Spring 프로젝트를 설계할 때, 패키지 구조만큼 중요한 것이 바로 모델 설계의 분리 원칙입니다.특히 JPA를 사용할 때는 다음과 같은 고민이 자주 발생하죠:Entity를 바로 응답에 써도 될까?DTO는 어디까지 분리할까?값 객체(VO)는 어떤 걸로 만들면 좋을까?Projection은 언제 쓰는 게 좋을까?이번 글에서는 실무 관점에서 DTO, VO, Projection을 어떻게 구분하고 활용할지를 정리했습니다.🔄 DTO와 Entity는 왜 분리할까?항목DTOEntity역할요청/응답 데이터 전달DB 매핑 + 비즈니스 로직위치Controller ↔ Client도메인 내부, Repository ↔ DB특징직렬화/역직렬화 최적화영속성 관리 대상, 로직 포함 가능예시UserResponseDTO, OrderRe..
[Part 1] Spring 패키지 구조 설계 전략: MVC vs 도메인 중심
·
Programming/Spring
Spring 프로젝트를 시작할 때 가장 먼저 마주하는 선택지 중 하나가 “패키지 구조를 어떻게 나눌 것인가?”입니다.많은 분들이 controller, service, repository처럼 계층 중심 구조(MVC 기반)로 시작하지만,실무에서는 도메인 중심 구조로 점차 옮겨가는 추세입니다.이번 글에서는 두 구조의 차이점, 장단점, 선택 기준을 구체적인 예시와 함께 정리해보았습니다.📌 구조 비교: MVC vs 도메인 중심항목MVC 패턴 기반 구조도메인 중심 구조기준역할 계층별(controller, service, repository)도메인 기능별(user, product, order)장점역할 분리가 명확익숙한 구조응집도 높음모듈화 용이협업에 유리단점같은 도메인의 코드가 분산됨초보자에게 익숙하지 않을 수 있..
Spring 트랜잭션에서 `@Transactional`이 무시되는 이유와 주의할 점
·
Programming/Spring
Spring에서는 @Transactional을 이용해 트랜잭션을 손쉽게 적용할 수 있지만, 프록시 기반이라는 특성 때문에 내부 메소드 호출 시 트랜잭션이 적용되지 않는 문제(self-invocation) 가 발생할 수 있습니다.이 글에서는 다음 세 가지 핵심 내용을 다룹니다:@Transactional은 프록시 객체를 통해 트랜잭션을 제어자기 호출(self-invocation) 은 프록시를 우회하므로 트랜잭션이 무시됨트랜잭션이 적용되지 않으면 어떤 일이 발생하는지1. @Transactional은 프록시를 통해 트랜잭션을 제어Spring은 @Transactional을 감지해 실제 객체가 아닌 프록시 객체를 생성합니다. 이 프록시가 트랜잭션을 시작하고, 메소드 실행 후 커밋 또는 롤백합니다.@Servicepu..
[Spring Boot] JPA vs Querydsl - 동적 쿼리 필터링 어떻게 다를까?
·
Programming/Spring
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/코딩 테스트
이 글에서는 프로그래머스 문제 순위를 Floyd-Warshall 알고리즘을 사용해 해결하는 과정을 설명합니다.🔍 문제 요약선수들 간의 경기 결과가 주어짐 (예: A가 B를 이김)이긴 사람과 진 사람 간의 관계를 이용해 정확한 순위를 알 수 있는 선수의 수를 구해야 함정확한 순위란? → 해당 선수가 다른 모든 선수들과 승패 관계가 확정되어 있을 때✅ 아이디어: Floyd-WarshallFloyd-Warshall 알고리즘은 모든 정점 쌍 사이의 최단 거리 또는 연결 관계를 계산할 때 사용됩니다.이 문제에서는 간접적인 승패 관계까지 전파하는 데 매우 적합합니다.관계 표현 방식관계값i가 j를 이김1i가 j에게 짐-1모름0🧠 알고리즘 구조for k in range(1, n + 1): # 중간 노드 ..
프로그래머스 문제 풀이: 리코쳇 로봇 (169199)
·
Programming/코딩 테스트
문제 링크 → 프로그래머스✨ 핵심 아이디어시작 지점에서 목표 지점까지 가장 빠른 경로를 구하는 최단 거리 문제일반적인 상하좌우 이동이 아닌, 장애물이나 벽에 닿을 때까지 미끄러지듯 이동따라서 BFS (너비 우선 탐색) 을 활용하여 최소 이동 횟수를 계산함🔧 알고리즘 전략1. 보드 분석"R": 시작 위치 (Robot)"G": 목표 위치 (Goal)"D": 장애물 (Dead zone)2. BFS (너비 우선 탐색)큐에 현재 위치와 이동 횟수를 저장 (h, w, depth)상하좌우 네 방향으로 이동 시, 장애물이나 벽에 닿을 때까지 이동이동이 끝나는 좌표가 visited에 없다면 큐에 추가💡 개선 포인트✅ 중복 코드 제거"U", "D", "L", "R"을 각각 처리하지 않고, 방향 벡터로 일반화direct..
[프로그래머스] 이모티콘 할인행사 - 백트래킹 + 가지치기 풀이
·
Programming/코딩 테스트
🏝️ 문제 개요문제 링크: 프로그래머스 - 이모티콘 할인행사문제 요약:maps라는 문자열 2차원 배열에서 'X'가 아닌 숫자들은 음식량을 의미하며, 상하좌우로 연결된 땅 덩어리(무인도)를 찾아 음식 총합을 구한 후 오름차순으로 정렬하는 문제.❓ 문제 요약각 유저는 할인율 기준과 이모티콘 플러스 가입 기준 금액을 가짐이모티콘마다 할인율을 10%, 20%, 30%, 40% 중 하나로 정해야 함목표는:이모티콘 플러스 가입자를 최대화동일한 수일 경우, 이모티콘 판매액을 최대화🧠 접근 방법기본적으로는 할인율 조합을 모두 탐색해야 함 → 4ⁿ 조합하지만:이모티콘 수가 많아지면 조합 수가 급격히 증가itertools.product로는 모든 조합을 한 번에 생성하기 때문에 최적화 불가따라서 재귀(DFS) + 가지치..
프로그래머스 무인도 여행 문제풀이 - DFS 재귀에서 런타임 에러가 난 이유
·
Programming/코딩 테스트
Python DFS 재귀 방식으로 접근했다가 RecursionError를 경험하고, return 기반 방식으로 개선한 기록입니다.🏝️ 문제 개요문제 링크: 프로그래머스 - 무인도 여행문제 요약:maps라는 문자열 2차원 배열에서 'X'가 아닌 숫자들은 음식량을 의미하며, 상하좌우로 연결된 땅 덩어리(무인도)를 찾아 음식 총합을 구한 후 오름차순으로 정렬하는 문제.🧪 [프로그래머스 무인도 여행] 첫 시도 - Python 재귀 DFS처음엔 DFS로 연결된 지점을 탐색해 음식량을 누적하려고 했습니다.이때 숫자 누적이 잘 안 돼서 temp_list라는 전역 리스트를 써서 처리했어요.import syssys.setrecursionlimit(10 ** 6)def solution(maps): directio..