프로젝트 하다가 만났던 LazyInitializationExceptionJPA 공부 후, 발생 원인과 해결법을 한번 정리해보고자 합니다😃 발생 원인서비스 단에 @Transactional을 붙여둔 상태에서 메서드가 종료되면 Hibernate의 Session도 함께 종료되어 영속성 컨텍스트에서 사라집니다.엔티티 객체의 속성 중, FetchType이 LAZY로 설정된 필드가 있었다면, 해당 트랜잭션 내에서, 프록시 객체로 채워진 상태일 것입니다. 이때, get을 통해 데이터를 가져오게 되면 쿼리를 통해 해당 객체를 실제 데이터로 채우게 됩니다.하지만 서비스 단에서 컨트롤러 단으로 코드 흐름이 넘어간 경우, 트랜잭션이 종료되어 영속성 컨텍스트에서 사라진 상태이므로 프록시 객체를 실제 객체로 채우지 못해 Laz..
스프링 프로젝트를 하며, db에 접근하게 되는 경우@Transactional을 자주 사용하고 있습니다🤔 트랜잭션은 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위로완전히 성공하거나 완전히 실패하는 일련의 논리적 작업단위입니다. 트랜잭션은 크게 아래 3가지 목적으로 사용해왔습니다.1. ACID 보장을 위해, 특정 실행 단위에서 오류 발생시 전체 실행 내용을 롤백해주는 기능 2. Dirty Checking 변경 감지 시, 수정 사항 바로 반영 3. ReadOnly 속성 프로젝트하며 마주쳤었던 LazyInitializationException 또한 Transactional 어노테이션에 대해정확히 알지 못하고 사용하여 마주했던 문제라 어노테이션을 한번 뜯어보았습니다🧩 공식문서에서 설명하는 @Tra..
간단한 Voucher 관리 프로그램을 만들던 도중,@Value로 주입받은 값을 생성자에서 사용하려니, NPE가 발생하여한참의 삽질 끝에 정확하게 언제 주입이 되는지 알아보게 되었습니다🚀 상황바우처 정보를 파일을 통해 관리하기 위해, yaml 파일에 파일 위치를 명시한 후 레포지토리 클래스에서 파일에 접근하여 바우처 정보를 읽고 쓰고자 아래와 같이 코드를 작성하였습니다. 문제의 코드🤔@Repository@Profile("default")public class FileVoucherRepository implements VoucherRepository { private Map vouchers; private final File voucherInfoCsv; @Value("${spring.fi..
스프링/스프링부트를 사용하면서왜 프레임워크를 쓰는거지?장점 말고 단점도 있을까?의문이 들어 정리하게 되었습니다🤔 📖 먼저 프레임워크에 대해 알아보기 전, 라이브러리란 무엇일까?라이브러리란 자주 사용되는 로직을 재사용하기 편리하도록 잘 정리한 일련의 코드들의 집합을 의미합니다."도서관"이라는 의미처럼, 필요할 때마다 꺼내볼 수 있는 책들이 모여있는 곳이라고 이해할 수 있습니다! 🚀 그렇다면 프레임워크란?한글로 번역하면 "뼈대", "기반 구조"를 뜻하며,프로그램의 기초를 구축할 수 있는 코드의 집합이라고 생각할 수 있습니다.👉쉽게 비유하면,개발자가 되기 위해 혼자 계획을 세워서, 개발 공부를 해나가는 것보다,전문 교육 기관(데브코스)의 도움을 받아 커리큘럼을 기반으로 개발 공부를 진행하면 더 ..
스프링부트 프로젝트 생성하는 방법이라면.. https://start.spring.io/ 👈이 사이트로만 해왔는데 방법은 되게 다양했습니다😲 Maven 프로젝트 생성 Gradle 프로젝트 생성 Spring CLI Spring Intializr Maven 프로젝트 생성🌳 Maven 프로젝트의 경우, pom 파일로 정의가 이루어집니다! 웹 문서가 html로 작성을 하면 브라우저가 html 파일을 읽어 DOM을 만드는 것처럼 pom.xml을 작성하면 Maven이 Project Object Model 이라는 객체를 만드는 것입니다. 그리고 해당 POM에 의해서 프로젝트에 필요한 것을 다운받아 프로젝트 구성이 됩니다. xml로 프로젝트에 대한 스트립트을 정의하면 Maven이 알아서 빌드해줍니다👍 Maven 프로젝트..