Spring(7)
-
[JPA] 변경감지(dirty checking)
Intro 해당 포스팅에서는 JPA가 제공하는 변경감지 기능을 가볍게 다룹니다. "JPA의 영속성 컨텍스트는 객체의 동등성 뿐만아니라 동일성도 보장한다" 는 내용이 포스팅의 핵심이므로 해당 내용을 잘 아시는 분은 넘어가셔도 좋을 것 같습니다!(지적 환영) Problem 팀원분이 JMeter를 이용해 성능 테스트를 진행하던 중, 병목 현상이 발생하는 부분을 발견하였습니다. https://github.com/prgrms-web-devcourse/Team-DarkNight-Kkini-BE/pull/223 [#221] Store내 병목 현상을 유발하는 코드 제거 by JoosungKwon · Pull Request #223 · prgrms-web-devcourse/Team-Dar 🌱 작업 사항 refactor(..
2023.05.18 -
수정자 DI, 생성자 DI
스프링 DI 방법 2가지 Dependency Injection(의존관계 주입) 강한 결합 객체 내부에서 다른 객체를 생성하면 강한 결합도를 갖게된다. A 클래스 내부에서 B라는 객체를 직접 생성할 경우, B 객체를 C로 변경해야 한다면 A 클래스 내부의 코드를 직접 수정해야한다. 런타임 이전에 의존관계가 이미 형성된다. 느슨한 결합 객체를 주입받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해 넘겨받는 것을 의미한다. 이는 결합도를 낮추고 런타임 시에 의존관계가 결정된다. 스프링에서는 의존관계 주입을 통해 객체 간 느슨한 결합을 유지할 수 있는데, 대표적으로 의존관계를 주입할 수 있는 Setter 주입과 생성자 주입에 대해 알아보자. 1. Setter 주입 IDE의 자동생성 기능으로 setter 메소..
2022.11.02 -
IoC(Inversion of Control)란
Ioc(제어의 역전)란 단순히 말하자면 프로그램의 제어 흐름 구조가 뒤바뀌는 것이다. [일반적인 실행 흐름] main() 메소드 등 시작 지점에서 다음에 사용할 오브젝트를 결정하고 생성 --> 생성한 오브젝트의 메소드를 호출 --> 해당 메소드 내에서 다음에 사용할 것을 결정하고 호출 --> 반복 제어의 역전은 이런 제어 흐름의 개념을 뒤집는다. 자신이 어떤 오브젝트를 사용할지 스스로 선택하지 않으며, 본인도 어디서 사용되는지 알 수 없다. 모든 제어 권한을 다른 대상에게 위임하기 때문이다. 서블릿을 예로 들면, 우리는 서블릿을 개발하고 서버에 배포할 수 있어도 그 실행을 우리가 직접 제어할 수 있는 방법은 없다. 대신 서블릿에 대한 제어권한을 가진 컨테이너가 적절한 시점에 서블릿 클래스의 오브젝트를 만..
2022.11.01 -
Error injecting constructor, java.lang.NoSuchMethodError와 spring-boot-maven-plugin not found
Spring boot CLI(2.7.5)로 maven 프로젝트를 생성했다. 프로젝트 생성은 아래 링크의 방법으로 진행했다. Spring Boot CLI 로 프로젝트 생성하기 IntelliJ로 프로젝트를 열어보니 아래의 에러가 발생했다. org.codehaus.plexus.component.repository.exception.ComponentLookupException: com.google.inject.ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultMo..
2022.10.31 -
[JPA] could not initialize proxy - no Session org.hibernate.LazyInitializationException
서비스 계층에서 아래의 modify 메소드를 작성하였고, 두 번째 이미지의 테스트 코드를 작성했다. modify 메소드는, PK로 Board를 가져온 뒤 내용과 제목을 변경한 후 save하는 메소드다. 서비스 계층에는 트랜잭션이 없으므로, 변경감지를 사용하지 않고 save 메소드를 통해 엔티티를 변경하였다. BoardService를 주입받은 뒤 아래의 modifyTest() 메소드를 실행한 결과 could not initialize proxy [com.example.board.entity.Board#2] - no Session org.hibernate.LazyInitializationException: could not initialize proxy [com.example.board.entity.Boar..
2022.09.07 -
No entity found for query 에러
서비스 계층에서, 회원 가입 시 입력한 아이디와 같은 ID를 사용중인지 체크하고자 한다. 위의 코드는 리포지토리에서 작성한 코드인데, No entity found for query 에러가 발생했다. 이는 쿼리문이 잘못되었다기 보다는 동일한 ID를 가진 엔티티가 없어서, getSingleResult()에서 에러가 발생한 것으로 보인다. getSingleResult()는 결과가 null일 경우 따로 처리를 해주어야 한다. Optional을 사용하는 것이 null체크 코드보다 깔끔하므로 아래와 같이 코드를 수정했다. public Optional findMemberByLoginId(String loginId){ List members = em.createQuery("select m from Member m wh..
2022.06.01