기본 콘텐츠로 건너뛰기

JPA @OneToOne: 참조 엔티티가 없을 때 Null 처리하는 방법 (@NotFound)

🧩 JPA @OneToOne: 참조 엔티티가 없을 때 Null 처리하는 방법 (@NotFound) AI 생성 이미지: JPA @OneToOne: 참조 엔티티가 없을 때 Null 처리하는 방법 (@NotFound) JPA 매핑 중 외래 키는 남아 있으나 실제로 참조하는 레코드가 삭제되어 관계가 깨지는 경우가 있습니다. 특히 1:1 매핑에서는 이런 상황이 런타임 예외로 이어지기 쉽습니다. 이 글에서는 JPA @OneToOne: 참조 엔티티가 없을 때 Null 처리하는 방법 (@NotFound)을 중심으로, Hibernate의 @NotFound 어노테이션을 활용해 안전하게 처리하는 실무 기법을 소개합니다. 1. 🚨 @OneToOne 관계에서 발생하는 문제 예를 들어 Member와 Profile이 1:1로 연결되어 있고, Member 테이블에 profile_id 외래 키가 존재한다고 가정합니다. 정상적인 상황: profile_id가 유효한 Profile 레코드를 가리킵니다. 문제 상황: profile_id가 DB에 남아 있으나, 실제 Profile 엔티티는 삭제된 경우(ORPHAN 데이터 발생). 기본 JPA/Hibernate는 외래 키가 null이 아니면 참조 대상이 존재한다고 전제합니다. 따라서 참조 대상이 없을 때 엔티티에 접근하면 EntityNotFoundException 또는 지연로딩 시 LazyInitializationException 같은 예외가 발생하여 서비스가 중단될 수 있습니다. 2. ✨ 해결책: `@NotFound(action=NotFoundAction.IGNORE)` Hibernate는 @NotFound 어노테이션을 제공해 이런 결손 데이터를 우아하게 다룰 수 있게 해줍니다. @...

Java 5~14 주요 변화 총정리 | AI 개발·LLM 통합 시대의 핵심 언어

Java 5~14 주요 변화 총정리 | AI 개발·LLM 통합 시대의 핵심 언어 AI 생성 이미지: Java 5~14 주요 변화 총정리 | AI 개발·LLM 통합 시대의 핵심 언어 🚀 Java 버전별 변화 (Java 5 ~ Java 14) 자바는 꾸준한 진화를 통해 언어 기능과 런타임 성능을 개선해왔습니다. 이 글, "Java 5~14 주요 변화 총정리 | AI 개발·LLM 통합 시대의 핵심 언어"는 Java 5부터 Java 14까지 도입된 핵심 기능을 실용적 관점에서 정리합니다. int java5 = 5 ; int java6 = 6 ; int java7 = 7 ; int java8 = 8 ; int java9 = 9 ; int java10 = 10 ; int java11 = 11 ; int java12 = 12 ; int java13 = 13 ; int java14 = 14 ; 🧠 각 버전의 주요 변화 Java 5: 제네릭스와 열거형(Enum), 애노테이션을 도입해 타입 안정성과 메타데이터 활용이 쉬워졌습니다. Java 6: JVM과 라이브러리의 최적화로 실행 성능이 개선되었고, JSR 223을 통한 스크립팅 연동이 가능해졌습니다. Java 7: try-with-resources로 자원 관리를 간소화하고, switch에서 문자열 사용을 지원합니다. Java 8: 람다 표현식과 스트림 API가 추가되어 컬렉션 처리와 병렬 처리가 훨씬 직관적입니다. Java 9: 모듈 시스템(Project Jigsaw)이 도입되어 대규모 애플리케이션의 모듈화와 보안 경계 설정이 가능해졌습니다. Java 10: 지역 변수의 타입 추론(var)이 추가되어 코드 가독성과 간결성이 향상됩니다. Java 11: LTS로서 장기 지원을 제공하며, 새로운 HTTP Client와 문자열 API ...

JPA @OneToMany/@ManyToOne에서 mappedBy reference an unknown target entity 에러 해결하기

JPA mappedBy reference an unknown target entity 오류 원인과 해결 방법 JPA로 @OneToMany / @ManyToOne 양방향 매핑 을 구현하다 보면 다음과 같은 오류를 한 번쯤은 만나게 됩니다. mappedBy reference an unknown target entity property 특히 아래와 같이 mappedBy="parentVO" 와 같이 지정한 경우, 필드명 / 매핑 관계 / 엔티티 설정 에 조금만 틀어져도 이 오류가 바로 발생합니다. 1. 예제 코드 구조 (Parent & Child) 질문에서 사용한 구조를 먼저 정리해보면 다음과 같습니다. A Class (Parent) @Entity public class Parent { @Id @GeneratedValue private Long parentSeq; @OneToMany(mappedBy = "parentVO") private List<Child> rsrcGuildsList; // getter / setter ... } B Class (Child) @Entity public class Child { @Id @GeneratedValue private Long childSeq; @ManyToOne(optional = false) @JoinColumn(name = "parent_seq", updatable = false, insertable = false) private Parent parentVO; // getter / setter ... } Parent에서는 @OneToMany(mappedBy="parentVO") 를...

jQuery DateTimePicker: 시작일/종료일 연동 구현하기

jQuery DateTimePicker: 시작일/종료일 연동 구현하기 AI 생성 이미지: jQuery DateTimePicker: 시작일/종료일 연동 구현하기 기간을 선택하는 UI에서는 시작일이 종료일보다 늦을 수 없고, 종료일은 시작일보다 앞설 수 없습니다. 이 가이드는 jQuery DateTimePicker: 시작일/종료일 연동 구현하기를 목표로 onShow 콜백을 활용해 두 필드 간의 유효성 검사를 실시간으로 적용하는 방법을 단계별로 설명합니다. 1. 🌐 HTML 구조 및 라이브러리 준비 날짜/시간 입력용 input 요소를 준비하고, 페이지에 jQuery와 DateTimePicker 플러그인을 포함해야 합니다. 기본 마크업은 간단합니다. HTML <input> 태그 <!-- 시작일/시간 선택 필드 --> <input type="text" id="popupSdt" placeholder="시작일시 선택"> <!-- 종료일/시간 선택 필드 --> <input type="text" id="popupEnd" placeholder="종료일시 선택"> <!-- (참고: jQuery 및 DateTimePicker 플러그인 파일 로드가 필요합니다.) --> 2. 🛠️ JavaScript 시작일/종료일 연동 로직 여기서는 피커가 화면에 보일 때마다 상대 필드의 값을 확인해 자신의 minDate 또는 maxDate 를 업데이트합니다. 이렇게 하면 사용자가 유효하지 않은 기간을 선택하지 못하도록 즉시 차단할 수 있습니다. JavaScript 코드 // 로...

Spring Security JSP 권한 처리 및 로그인 상태 표시

Spring Security JSP 권한 처리 및 로그인 상태 표시 AI 생성 이미지: Spring Security JSP 권한 처리 및 로그인 상태 표시 실무 가이드: Spring Security JSP 권한 처리 및 로그인 상태 표시 이 문서에서는 Spring Security를 활용해 JSP에서 로그인 상태에 따라 메뉴를 동적으로 보여주는 방법을 실제 예제로 설명합니다. 또한 CSS, JS 같은 정적 리소스에 대한 접근 제어 문제와 security="none" 설정이 예상대로 동작하지 않을 때 점검해야 할 사항을 함께 다룹니다. Spring Security JSP 권한 처리 및 로그인 상태 표시를 중심으로 실무 적용에 바로 쓸 수 있는 핵심 팁을 정리했습니다. 1. JSP에서 로그인 상태별 메뉴 표시 Spring Security의 JSP 태그 라이브러리를 쓰면 로그인 여부를 쉽게 검사해 메뉴를 분기할 수 있습니다. 간단한 태그만으로 익명 사용자와 인증된 사용자를 구분하고, 사용자 정보를 뷰에 안전하게 전달할 수 있습니다. <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%> <!-- 익명 사용자만 로그인 링크 표시 --> <sec:authorize access="isAnonymous()"> <a href="/login.do">로그인</a> </sec:authorize> <!-- 로그인 사용자만 이름과 로그아웃 표시 --> <sec:authorize access="isAuthenticated()"> <sec:authentication var="mbrInfo" property="details.mbrInfo" /...

Spring Security 설정 완벽 가이드 — web.xml + security-context.xml 예제 총정리

Spring Security 설정 완벽 가이드 — web.xml + security-context.xml 예제 총정리 Spring Security 설정 완벽 가이드 — web.xml + security-context.xml 예제 총정리 Spring Security는 Java 웹 애플리케이션에서 인증(Authentication)과 인가(Authorization)을 처리하는 강력한 프레임워크입니다. 이번 포스팅에서는 web.xml 의 필터 등록부터 security-context.xml 의 구체적인 설정까지, 예제 코드와 함께 하나씩 살펴보겠습니다. 1️⃣ web.xml에 Spring Security 필터 등록 Spring Security를 사용하려면, 먼저 DelegatingFilterProxy 를 web.xml 에 등록해야 합니다. 이 필터는 Spring 컨테이너에서 관리되는 springSecurityFilterChain 을 서블릿 필터 체인에 연결하는 역할을 합니다. <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 위 설정을 통해 모든 요청( /* )이 Spring Security 필터 체인을 거치게 됩니다. 2️⃣ security-context.xml 설정 다음은 Spring Security의 주요 설정을 담은 s...

Spring Boot Access Log 구현 가이드 | AOP + Lombok + 실무 로그 분석

Spring Boot Access Log 구현 가이드 | AOP + Lombok + 실무 로그 분석 AI 생성 이미지: Spring Boot Access Log 구현 가이드 | AOP + Lombok + 실무 로그 분석 실무에서 바로 쓰는 Spring Boot Access Log 구현 전략 (AOP + Lombok 활용) Spring Boot 애플리케이션에서 HTTP 요청 로그(Access Log)를 자동으로 캡처하고, 요청자 IP, 요청 URI, HTTP 메서드, 파라미터까지 정확히 수집하는 방법을 단계별로 정리합니다. 이 가이드는 유지보수성과 확장성을 고려해 Lombok 과 AOP 를 결합한 구현 방식을 제시하며, 운영 환경에서 실무적으로 활용 가능한 패턴을 설명합니다. 본문 전체에서 Spring Boot Access Log 구현 가이드 | AOP + Lombok + 실무 로그 분석 키워드를 적절히 반영합니다. 1. Maven 의존성 설정 (Spring Boot + Lombok + AOP) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> Lombok을 도입하면 DTO와 빌더 코드를 대폭 줄여 가독성과 유지보수가 개선됩니다. 의존성 구성만으로도 AOP와 Lombok 결합에 필요한 기초를 마련할 ...