본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ

IT기술/spring44

[JPA] 1+N 문제, 현상 정리 JPA N+1 (1번 조회해야할 것을 N개 종류의 데이터 각각을 추가로 조회하게 되서 총 N+1번 DB조회를 하게 되는문제이다.) JPA의 Entity 조회시 Query 한번 내부에 존재하는 다른 연관관계에 접근할 때 또 다시 한번 쿼리가 발생하는 비효율적인 상황을 말한다. 즉시 로딩으로 데이터를 가져오는 경우 ( N+1 문제가 바로 발생 ) 지연 로딩으로 데이터를 가져온 이후에 가져온 데이터에서 하위 엔티티를 다시 조회하는 경우 ( 하위 엔티티를 조회하는 시점에 발생 ) 0. 내가 정리하는 N+1 문제 @Entity public class MemberJpql extends BaseEmbeded { @Id @GeneratedValue private Long id; private String usernam.. 2024. 4. 1.
[Spring] JPA 에러must be manually assigned before calling 'persist()' 에러 해결하기 JPA 연습중에 다음과 같은 에러가 발견되었다. org.hibernate.id.IdentifierGenerationException: Identifier of entity 'cohttp://m.minod.jpa.domain.inherit.extend.MemberBase' must be manually assigned before calling 'persist()' Identifier Entity 에러라고 함 테스트 소스는 다음과 같다. em.persist() 할 때 에러가 나는데 원인이 무엇인지?? @Slf4j @SpringBootTest public class MappedSuperclassTest { // entity 클래스들에 상속시켜서 필드만 추가하게 하는 어노테이션인 @MappedSuperclas.. 2024. 3. 27.
[JPA] EntityExistsException: detached entity passed to persist 문제 해결하기 Mbr1 소스에서 Mbr1 관련해서 엔티티가 이미 만들어져 더 생성할 수 없다는 에러가 나왔었습니다. @Entity @Table(name = "MBR") // 테이블 id 원하는데로 지정가능, @SequenceGenerator( name = "MBR_SEQ_GENERATOR", sequenceName = "MBR_SEQ", initialValue=1, allocationSize=1 ) @ToString public class Mbr1 { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MBR_SEQ_GENERATOR") private Long id; private String username; public Mbr1(){} publ.. 2024. 3. 24.
[Spring] 테스트에서 Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test 문제 해결 Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test 테스트 환경에서 테스트 중에 위 같은 에러를 확인했습니다. 테스트 경로에서 Config파일을 읽지 못 한다고 하는 것 같은데, 사실 이 에러는 @SpringBootTest 클래스가 실행중 에러가 발생하는 것입니다. @SpringBootTest가 실행되지면서 SpringBootApplication 경로를 읽지 못해서 일 수도 있고, 의존성 설정된 dataSource를 자동주입 실패했을 경우 실패할 수 있고, 컴포넌트 스캔 경로가 맞지 않아 Config 경로를 못읽어 Bean생성 실.. 2024. 3. 6.
[Spring] SpEL, Value로 어노테이션에 값 전달하기 https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/expressions.html 8. Spring Expression Language (SpEL) This section introduces the simple use of SpEL interfaces and its expression language. The complete language reference can be found in the section Language Reference. The following code introduces the SpEL API to evaluate the literal string expression 'Hel docs.. 2024. 2. 27.
[Spring] 어노테이션 정리 스프링 어노테이션 정리, 최신화를 주기적으로 할 예정입니다. 스프링 어노테이션 @EventListener(ApplicationReadyEvent.class) 스프링 컨테이너가 완전히 초기화를 다 끝내고, 실행 준비가 되었을 때 발생하는 이벤트이다. 스프링이 이 시점에 해당 애노테이션이 붙은 initData() 메서드를 호출해준다. @Profile("local") 특정 프로필의 경우에만 해당 스프링 빈을 등록한다. 여기서는 local 이라는 이름의 프로필이 사용되는 경우에만 testDataInit 이라는 스프링 빈을 등록한다. 이 빈은 앞서 본 것인데, 편의상 초기 데이터를 만들어서 저장하는 빈이다. 프로파일 별로 jar빌드도 가능하며 설정도 가능하다. @Configuration Bean을 수동으로 등록해.. 2024. 2. 27.
[Spring] No JSR-223 scripting engine could be bootstrapped for language "javascript" 오류 해결 No JSR-223 scripting engine could be bootstrapped for language "javascript" 강의를 듣던 중 Validation 처리를 위해 @ScriptAssert 를 사용하는데 위처럼 오류가 나타났습니다. validation annotation 중 @ScriptAssert 은 Java Scripting API의 스크립팅 언어를 지원해주는 기능을 사용합니다. JDK11부터 Nashorn script API가 Deprecated되었고, JDK 15부터는 Removed되었습니다. JDK8 ~ JDK14 = NashornVM 저는 JDK17환경에서 개발중이다보니 버전이 맞지 않아 에러가 발생한 것입니다. JDK 15부터는 Nashorn engine 대신 graalv.. 2024. 2. 20.
[Spring] 하이버네이트 Validator, Bean Validation 빈 벨리데이션이란? Bean Validation? 검증 로직을 표준화하여 모든 프로젝트에 적용할 수 있는 기술을 말합니다. Bean Validation을 잘 활용하면, 애노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있습니다. Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준입니다. 쉽게 이야기 해서 검증 애노테이션과 여러 인터페이스의 모음입니다. 마치 JPA가 표준 기술이고 그 구현체로 하이버네이트가 있는것 처럼 Bean Validation을 구현한 기술중에 일반적으로 사용하는 구현체는 하이버네이트 Validator입니다. 이름이 하이버네이트가 붙어서 그렇지 ORM과는 관련이 없습니다. 하이버네이트에 대해서는 별도로 정리하고, 하이버네이트 Va.. 2024. 2. 20.
[Spring] BindingResult 검증도구 스프링이 제공하는 검증 오류를 보관하는 객체입니다. 컨트롤러에서 파라미터로 선언시키며, 검증 오류가 발생하면 여기에 보관하면 view로 전달 가능합니다. BindingResult.addError(에러객체) 에러객체 : 에러라고 판단할 정보를 담은 객체이며 ObjectError , FieldError 가 사용됩니다. 사용자가 원하는 오류 코드와, 오류 메시지를 만들고 message.properties 또는 별도의 프로퍼티를 만들어 저장 한 뒤 특정한 상황이 되면 BindingResult 에서 에러를 불러와서 출력시키기 위해 사용합니다. 이는 특정 상황에서 어떤 오류가 발생했는지 표준화를 시키기 위해, 그리고 원하는 조건에 부합하지 않을 경우 즉, 검증되지 않은 특정한 상황에서, 커스텀 에러를 내고싶을 때 .. 2024. 2. 20.
[Thymeleaf] 스프링에서 웹페이지 만드는 방법3, form 에서 유용한 thymeleaf 일반적으로 폼에서 사용하기 좋은 thymeleaf를 별도로 정리해보려 합니다. form은 데이터를 등록하거나 수정하는 뷰 페이지에서 주로 사용되며, 데이터를 post/get으로 넘겨주게 됩니다. 타임리프가 form에서 어떤 기능을 도울 수 있을지 정리해보겠습니다. - input field의 id, name 자동 등록 안의 id와 name을 자동으로 등록할 수 있습니다. 컨트롤러에서 객체를 model에 넣어 줬을 때, 객체의 맴버변수를 id, name, value를 넣을 수 있습니다. 컨트롤러에서 Item 객체에 itemName 맴버변수의 값만 추가해서 model에 넣었습니다. Html에서 th:field="*{itemName}" 만 추가한 것으로 id, name, value를 자동으로 렌더링 시켜줍니다... 2024. 2. 19.
[Thymeleaf] 스프링에서 웹페이지 만드는 방법1, 타임리프 문법 정리 보호되어 있는 글 입니다. 2024. 2. 17.
[Spring] thymeleaf 디자인 간략 최소 정리 보호되어 있는 글 입니다. 2024. 2. 17.