Thymeleaf화면을 동적으로 만들 수 있는 템플릿 엔진 미리 정의된 템플릿(Template)을 만들고 동적으로 HTML 페이지를 만들어서 클라이언트에 전달하는 방식요청이 올 때마다 서버에서 새로운 HTML을 만들어 주기 때문에 SSL 서버 사이드 렌더링이라 한다. 1. 특징'natural templates' 확장자명 .htmlThymeleaf문법은 html 태그 안쪽 속성으로 사용된다. 2. thymeleaf_basicItemDto 연습용 Controller 생성 hello.example.controller.ThymeleafExController hello.example.dto.ItemDto 클래스 생성데이터를 주고받을 때는 Entity 클래스 자체를 반환X 데이터 전달용 객체(Data Trans..
Querydsl SQL, JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API JPA Criteria에 비해서 편리하고 실용적이다 1. Querydsl 장점 고정된 SQL문이 아닌 동적으로 쿼리를 생성할 수 있다. 쿼리 재사용 제약 조건 조립 및 가독성 향상 문자열X 자바 소스코드로 작성 -> 컴파일 시점에서 오류 발견 가능 IDE의 도움으로 자동완성이 가능 -> 생산성 향상 2 build.gradle 설정 사용하기에 앞서 몇 가지 설정이 필요하다. // 1. queryDsl version 정보 추가 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.7.4' id 'io...
Spring Data JPA @Query SQL과 유사한 JPQL을 사용하여 복잡한 쿼리를 처리할 수 있게 도와주는 기능 간단한 쿼리는 "쿼리 메서드"를 사용해도 되지만 조건이 2가지 이상이면 되도록 @Query를 사용 SQL과 JPQL의 차이점 SQL JPQL DB의 테이블을 대상으로 쿼리 엔티티 객체를 대상으로 쿼리(객체지향 쿼리) 특정 DB에 종속적이다 (DB마다 SQL이 조금씩 다르다) 특정 DB에 종속적X (SQL을 추상화해서 사용, JPQL로 작성하면 SQL로 변환된다) 1. @Query사용(JPQL) @Query("JPQL") 쿼리 어노테이션 안에 JPQL로 작성한 쿼리문을 넣어준다. from 뒤에는 엔티티인 Item을 넣어주고 as로 i(별칭)를 지정 as는 생략 가능 별칭 생략 불가 e...
쿼리 메서드 쿼리 메서드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나 Repository 인터페이스에 간단한 네이밍 룰을 이용하여 메서드를 작성하면 원하는 쿼리를 실행할 수 있다.(엔티티 이름 생략 가능) 자세한 방법 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods 1. ItemRepository에 findByItemName 추가 2. ItemRepositoryImpl에서 findByItemName 구현 JPQL을 이용하여 findyItemName을 구현한다. 3. findByName 테스트 ItemRepositoryTest.class에 findBynameTest메서드 추가 @Sprin..
1. 상품 판매상태를 enum 클래스로 정의 enum 클래스에 대한 설명 hello.example.constant.ItemSellStatus.java 생성 상품의 현재 판매상태(판매, 품절)를 나타 내는 상수(SELL, SOLD_OUT) 2. 상품 클래스 생성 hello.example.domain.Item.java 생성 상품의 현재 판매상태는 enum타입의 ItemSellStatus변수를 갖는다. 상품 조회를 위한 @Getter선언과 Item클래스를 문자열로 출력해주는 @ToString선언 정적 팩토리 메서드를 사용할 예정이기 때문에 @Setter는 사용하지 않았다. 3. 상품 클래스 생성(+어노테이션) hello.example.domain.Item.java 생성 Table Schema을 위한 어노테이션..
BeanFactory 스프링 컨테이너의 최상위 인터페이스이다. 스프링 빈을 관리하고 조회하는 역할을 담당. getBean()을 제공한다. ApplicationContext BeanFactory 기능을 모두 상속받아서 제공한다. 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하는데, 차이는 뭘까? 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론!! 수 많은 부가기능이 필요하다. ApplicationContext가 제공하는 부가기능 메세지소스를 활용한 국제화 기능 ex) 메세지가 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력해준다. ex) 어떤 홈페이지를 한국어세 들어가면 한국어로 출력, 영어권에서 들어가면 영어로 출력 환경변수 ex) 로컬, 개발, 운영등을 구분해서 ..
부모 타입으로 조회하면, 자식 타입도 함께 조회된다. 모든 자바 객체의 최고 부모인 Object타입으로 조회하면, 모든 스프링 빈을 조회한다. 부모 타입 조회시 자식이 둘 이상인 경우 DiscountPolicy 타입으로 rateDiscountPolicy() 와 fixDiscountPolicy() 두개의 @Bean이 있다. 이로 인해서 스프링 컨테이너는 어떤 DiscountPolicy를 불러와야 할지 혼동되기 때문에 NoUniqueBeanDefinitionException 에러를 발생시킨다. @Configuration static class TestConfig { @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy..
타입으로 조회시 `동일한 타입이 둘 이상일때 NoUniqueBeanDefinitionException`이 발생한다. 이때는 빈 이름을 지정해주자!! ac.getBeansOfType()을 사용하면 해당 타입의 모든 빈을 조회 가능 package hello.core.beanfind; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoUniqueBeanDefinitionException..