분류 전체보기 364

[📘 심화 Spring] 3-3. JPQL (Java Persistence Query Language)

📘 목차JPQL 등장 배경과 한계기본 문법 반환 타입 및 결과 파라미터 바인딩 Embedded Type 프로젝션 (Projection) 페이징 (Paging) JOIN CASE 식함수1. JPQL 등장 배경과 한계 객체 중심 설계와 JPA 의 한계JPA는 객체(Entity) 중심의 데이터베이스 접근을 지향한다.단순 조회는 em.find() 또는 객체 간 참조 탐색으로 가능하다.모든 데이터를 객체로 불러올 수는 없음특정 조건 기반의 복잡한 검색은 불가능→ 조건 기반 조회가 필요한 상황에서는 SQL 같은 쿼리가 필요해짐 JPQL의 등장JPQL(Java Persistence Query Language)은 객체(Entity)를 대상으로 SQL과 유사한 문법으로 작성된 객체지향 쿼리 언어이다.특징Entity..

Spring/강의 2025.06.09

[📘 심화 Spring] 3-2. API 예외 처리

📘 목차@ExceptionHandler@ControllerAdvice@RestControllerAdvice정리1. @ExceptionHandler특정 컨트롤러 또는 컨트롤러 메서드 내에서 발생하는 예외를 처리하기 위해 사용한다.메서드에 붙이며, 처리할 예외 타입을 지정한다.특징해당 컨트롤러 내에서만 적용됨여러 예외를 하나의 메서드로 처리 가능 (파라미터에 여러 예외 타입 지정)@RestControllerpublic class UserController { @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { // 예외 발생 가능 return userService.findById(id); ..

Spring/강의 2025.06.09

[📘 심화 Spring] 3-1. Spring Bean 생명주기

📘 목차Bean 생명주기생명주기 콜백 종류Bean Scope와 생명주기1. Bean 생명주기Spring이 Bean을 생성하고 의존성을 주입한 뒤, 초기화 작업을 수행하고, 필요 시 종료 메서드를 호출하는 일련의 과정을 의미한다. 생명주기 요약 Spring Container 초기화Bean 인스턴스 생성의존성 주입 (DI)초기화 메서드 호출 (@PostConstruct, afterPropertiesSet())Bean 생성 및 의존관계 설정이 완료된 후 호출Bean 사용소멸 메서드 호출 (@PreDestroy, destroy())Bean이 소멸되기 직전에 호출Bean 소멸2. 생명주기 콜백 종류Spring은 Bean의 초기화와 소멸 시점에 사용자 정의 로직을 삽입할 수 있도록 다양한 콜백 수단을 제공한다. ..

Spring/강의 2025.06.09

[📘 심화 Spring] 2-2. JPA 고급 매핑

📘 목차프록시 (Proxy)지연 로딩 (Lazy) vs 즉시 로딩 (Eager)영속성 전이 (Cascade)고아 객체 (Orphan Removal)1. 프록시 (Proxy)JPA는 엔티티를 실제로 조회하지 않고도 프록시 객체를 통해 지연 조회(Lazy Loading)를 가능하게 한다. Entity 조회 방식 em.find(): 실제 객체를 즉시 조회한다.em.getReference(): 프록시 객체를 반환하며, 실제 객체는 필요 시 조회한다. (지연 로딩)Item item = em.getReference(Item.class, 1L); // 프록시 반환 프록시 특징실제 클래스를 상속받은 가짜 객체실제 데이터를 사용하는 시점에 쿼리 실행instanceof는 사용할 수 있으나, 프록시 초기화 여부는 주..

Spring/강의 2025.06.09

[📘 심화 Spring] 2-1. JPA 연관관계 매핑

📘 목차연관관계 매핑1 : N 연관관계1 : 1 연관관계N : M 연관관계상속관계 매핑1. 연관관계 매핑 연관관계의 종류 관계 타입N:1 (ManyToOne)1:N (OneToMany)1:1 (OneToOne)N:M (ManyToMany)방향성단방향: 한쪽 엔티티만 상대 엔티티를 참조양방향: 양쪽 엔티티가 서로를 참조 주요 어노테이션 관계 타입 어노테이션 비고 N : 1@ManyToOne가장 많이 사용됨1 : N@OneToMany 1 : 1@OneToOne N : M@ManyToMany신중하게 사용 권장 단방향과 양방향 연관관계테이블 관점외래 키(FK) 하나로 두 테이블 간 JOIN 가능객체 관점단방향: 외래키가 있는 쪽 엔티티만 상대 엔티티를 참조 가능양방향: 두 엔티티 모두 서로를 참조..

Spring/강의 2025.06.09

[📘 심화 Spring] 1. Converter, Formatter

📘 목차HttpMessageConverterArgumentResolverReturnValueHandlerTypeConverterConverterConversionServiceConverter 적용 (실습)FormatterSpring Formatter1. HttpMessageConverter HttpMessageConverterHTTP 요청(Request) 또는 응답(Response)의 바디(body)를 자바 객체로 변환하거나, 자바 객체를 HTTP 메시지 바디로 변환하는 역할을 한다.JSON, XML, 바이너리 데이터 ↔ 자바 객체 역할컨트롤러 메서드의 @RequestBody, @ResponseBody 처리를 담당클라이언트와 서버 간 데이터 직렬화/역직렬화 담당 주요 구현체 MappingJackso..

Spring/강의 2025.06.09

[뉴스피드 프로젝트] 정리 & 회고

요구 사항 정의 및 설계https://gajicoding.tistory.com/360 [뉴스피드 프로젝트] 요구 사항 정의 및 설계1. 요구 사항 정의필수 기능프로필 관리프로필 조회 기능프로필 수정 기능비밀번호 수정 조건비밀번호 예외처리뉴스피드 게시물 관리게시물 작성, 조회, 수정, 삭제 기능사용자 인증회원가입gajicoding.tistory.com새롭게 알게된 지식.github 디렉토리Spring Boot 프로젝트에서 Redis 연동 하기문제 해결Spring Security 에러 핸들링 오류 해결, /error 접근 권한 문제@ControllerAdvice가 Filter 예외를 잡지 못하는 문제 해결느낀 점 & 마무리 발표 자료https://docs.google.com/presentation/d/1bf..

[뉴스피드 프로젝트] 요구 사항 정의 및 설계

1. 요구 사항 정의필수 기능프로필 관리프로필 조회 기능프로필 수정 기능비밀번호 수정 조건비밀번호 예외처리뉴스피드 게시물 관리게시물 작성, 조회, 수정, 삭제 기능사용자 인증회원가입 기능회원탈퇴 기능친구 관리 도전 기능검색 및 정렬 기능정렬 기능기간별 검색 기능댓글댓글 작성, 조회, 수정, 삭제좋아요게시물 및 댓글 좋아요 / 좋아요 취소 기능2. 와이어 프레임 작성3. 필수 기능 DB 설계개념적 설계 논리적 설계 물리적 설계DROP DATABASE IF EXISTS newsFeed;CREATE DATABASE IF NOT EXISTS newsFeed;USE newsFeed;-- 사용자 인증(accounts) 테이블 생성CREATE TABLE accounts ( id BIGINT AUTO_INC..

.github 디렉토리

1. .github 란?GitHub에서 인식하는 특수한 구성 파일들을 저장하는 공간이 디렉토리를 통해 이슈 템플릿, PR 템플릿, 자동화 워크플로우, 행동 수칙 등을 정의할 수 있다.2. 주요 기능 Issue Template ISSUE_TEMPLATE/bug_report.yml 또는 feature_request.yml 같은 파일을 만들어 이슈를 등록할 때 일정한 형식을 유도할 수 있다.# .github/ISSUE_TEMPLATE/bug_report.ymlname: 🐞 Bug Reportdescription: 버그 제보를 위한 템플릿title: "[BUG] "labels: [bug]body: - type: textarea id: what-happened attributes: labe..

Git/Git 2025.06.04

@ControllerAdvice가 Filter 예외를 잡지 못하는 문제 해결

문제 상황JWT 인증을 위한 커스텀 필터(JwtFilter)에서 토큰 유효성을 검사할 때, 아래와 같이 JwtValidationException이라는 커스텀 예외를 던지도록 구현하였다 catch (SecurityException | MalformedJwtException e) { throw new JwtValidationException("유효하지 않는 JWT 서명입니다.", HttpServletResponse.SC_UNAUTHORIZED);} catch (ExpiredJwtException e) { throw new JwtValidationException("만료된 JWT 토큰입니다.", HttpServletResponse.SC_UNAUTHORIZED);} catch (UnsupportedJ..