스프링 46

[MVC 기초] 메세지와 국제화 (스프링 부트 + 타임리프를 곁들인)

메세징 html에서 사용될 단어들을 properties 파일에 key=value 로 저장해둔 뒤, 가져다 쓰는 것 국제화 언어별로 메세지를 별도 관리하여 국제화 서비스를 구현하는 것 message properties 파일을 언어별로 관리한다. 어떻게 언어를 감지하여 국가별로 다른 언어를 뿌려주는가? http accept-language 헤더 값을 사용하거나 사용자가 직접 언어를 선택하게 하거나, 쿠키등을 사용하여 처리 감지된 언어별로 다른 properties 파일 관리 messages_en.properties 영어 국가에서 접근하면, 선택하면 동작 item=Item item.id=Item ID item.itemName=Item Name item.price=price item.quantity=quantit..

스프링/MVC 2022.05.20

[Thymeleaf] 기본 문법

thymeleaf-basic ?? // #타임리프 기본 사용법 기본 문법 • 간단한 표현: ㅤ ◦ 변수 표현식: ${...} ㅤ ◦ 선택 변수 표현식: *{...} ㅤ ◦ 메시지 표현식: #{...} ㅤ ◦ 링크 URL 표현식: @{...} ㅤ ◦ 조각 표현식: ~{...} • 리터럴 ㅤ ◦ 텍스트: 'one text', 'Another one!',… ㅤ ◦ 숫자: 0, 34, 3.0, 12.3,… ㅤ ◦ 불린: true, false ㅤ ◦ 널: null ㅤ ◦ 리터럴 토큰: one, sometext, main,… • 문자 연산: ㅤ ◦ 문자 합치기: + ㅤ ◦ 리터럴 대체: |The name is ${name}| • 산술 연산: ㅤ ◦ Binary operators: +, ..

스프링 2022.04.28

[MVC 기초] PRG 패턴 (Post->Redirect->Get) 사용자의 Data 등록폼에서 새로고침시 대처법 + RedirectAttribute 으로 동적 html 생성

item-service PRG 패턴 (Post/Redirect/Get) 페이지에서 Data가 SAVE되고 나서, Redirect를 해주지 않으면, 계속해서 같은 URL을 호출하기 때문에 지속적으로 POST에 SAVE 명령을 호출하여 데이터가 저장될 수 있다. 단순 Form View로 전송 @GetMapping("/add") public String addForm() { return "basic/addForm"; } 새로고침 새로고침은 가장 마지막에 요청한 URL 방식을 그대로 반복한다. (Get이던, Post이던) 나쁜 예 @PostMapping("/add") public String addItemV2(@ModelAttribute("item") Item item, Model model) { itemRep..

스프링/MVC 2022.04.24

[JPA 기초] fetch join시에 XtoMany에서 List Collections들과 join시에 중복 데이터 삭제하는법 (JPQL + distinct)

//==fetch join시에 XtoMany에서 List Collections들과 join시에 중복 데이터 삭제하는법 ==// ex) Order를 불러올 때, orderItems도 join해서 부르면 orderItems의 개수만큼 중복 Order가 불려온다. Order에 연결된 orderItems 개수만큼 중복된 모습 fetch join 나쁜 예 public List findAllWithItem(OrderSearch orderSearch) { return em.createQuery("select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch..

스프링/JPA 2022.04.05

[JPA 기초] API 사용시 DTO로 변환하는 이유 + 주의사항 (DTO 내부에 Entity객체가 없어야 한다)

API 사용을 할 때 DTO를 만들어서 받는 이유 API 스펙에 맞춰서 @ResponseBody Entitny를 사용하는게 아니라 DTO를 하나 만들어서 해야한다. Entity를 사용하게되면 어디까지 API에서 받고 Binding 되는지, 추가적으로 다른 코드에서 Binding 했는지 모를 수도 있다. (모든 변수가 들어올 가능성이 있으므로) 따라서 DTO에 해당 API를 FIT하게 맞춰서 딱 받는 스펙을 알 수 있다. 외부에 Entity를 보여줘서도 안됨. 받은 Request를 CreateMemberRequest DTO를 바인딩하여 생성, CreateMemberResponse로 전송 @PostMapping("/api/v2/members") public CreateMemberResponse saveMem..

스프링/JPA 2022.04.05

[JPA 기초] OSIV (Transaction 생존 범위에 따른 성능, 대처에 대해)

OSIV Open Session in view : 하이버네이트 Open EntityManager in view : JPA 관례상 OSIV라고 한다. (JPA 가 나중에 나옴) 서버시작때 warn을 주는 모습 2022-02-14 00:12:00.577 WARN 19764 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning..

스프링/JPA 2022.04.05

[JPA 기초] JPA에서 기존 엔티티의 값을 수정하는 방법 (부제 : 왜 em.merge() 사용을 지양해야하는가)

준영속Entity의 경우 (준영속Entity는 em.find를 한 것이 아닌, DB에는 존재하지만 순간적으로 자바에서 객체로만 관리되어져 EntitnyManager 1차캐시에 등록X 객체 > Update할 경우 2가지 방법이 존재한다. 변경 감지를 수동으로 사용하는 법 (영속 Entitny로 등록해줘서 dirtyChecking으로 수정되게 하는 법) 결과적으로 말하자면 merge 사용은 지양해야한다. 변경 감지는 따로 updateMethod를 파서 해당 id로 em.find를 시켜 영속성을 만들어 1차캐시에 저장하고, 이후 그 객체를 변경해주면 이후 tx 커밋시에 자동 등록된다. merge도 이와 비슷한 맥락인데, 1차 캐시에서 찾다가 없으면 db에서 꺼내온다. 여기서 영속성이 생기고, 이후 찾아온 객체..

스프링/JPA 2022.04.05

[JPA 기초] 기본 Entity 설정시 사용되는 annotation 정리

@PersistenceContext 이 어노테이션이 있으면 EntityManager가 주입된다. build.gradle의 jpa보고 yml 파일 읽어서 설정된 대로 만들어서 DI 해줌. EntityManger 객체는 JPA에서 CRUD를 호출하는 기능 @Repository public class MemberRepository { /*이 어노테이션이 있으면 EntityManager가 주입된다. jpa보고 yml 파일 읽어서 */ @PersistenceContext private EntityManager em; @Embeddable (내장타입 대상 클래스의 상단) @Embedded (내장타입을 사용하는 객체의 변수 설정 위) Jpa의 내장타입이란 뜻입니다. Jpa에서 domain 생성시 경우에 따라 안에 들..

스프링/JPA 2022.04.05

[MVC 기초] 빈 스코프 @Scope 생존 범위 설정 방법 + Prototype, 웹 스코프를 어떻게 Spring에서 Proxy 객체로 다형성을 지키며 개발하는지 (LAZYLOADING)

싱글톤은 너무나 알기 쉽기 때문에 생략하고, 특정 경우에 사용할 다른 종류를 알아보자. 프로토타입 빈 생성 요청마다 DI컨테이너가 계속해서 새로운 인스턴스를 생성해주는 것. ( = 클라이언트가 요청마다 새로운 인스턴스 생성) 💥DI 컨테이너는 빈 인스턴스 생성, 의존관계 주입과 초기화 단계까지만 처리한다. 이후 스프링은 어떻게 처리하던 클라이언트에게 위임.(관리 안한다는 뜻) -> 따라서 @PreDestroy 호출 안됨. 클라이언트가 수동으로 종료해줘야 한다. @Test void prototypeBeanFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); Syst..

스프링/MVC 2022.03.31

[MVC 기초] 빈 라이프 사이클 이용해서 의존관계 (기본 @PostConstruct, @PreDestroy + 수정 불가한 외부 라이브러리의 빈 생성, 파괴시에 동작시키는 방법)

특정 빈을 Spring에 등록하고, 그 빈의 의존관계가 주입된 후(완전히 생성된 후) 무언가 작업을 하고, 삭제 전에 어떤 작업을 하고 싶을 때가 있다. 기본적으로 @PostConstruct, @PreDestroy 사용을 하면 된다. 그러나 외부 라이브러리를 사용할 때도 있는데, 이럴 때는 내부 코드를 수정할 수 없으므로 수동으로 @Bean 등록시에 특정 메서드의 이름을 생성후, 소멸전 메서드로 등록을 해줘야 한다. 스프링 빈의 라이프 사이클 기본적인 @PostConstruct, @PreDestroy의 동작 시점은 아래와 같다. 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> @PostConstruct -> 사용로직 -> @PreDestroy -> 스프링 종료 // 기본 어노테이션 사..

스프링/MVC 2022.03.30
1 2 3 4 5