본문 바로가기

Spring

(77)
SpringBoot-JPA에서 DTO로 바로 조회하기 package jpabook.jpashop.repository; import jpabook.jpashop.domain.Member; import jpabook.jpashop.domain.Order; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.util.StringUtils; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import javax.persistence.criteria.*; import java.util.ArrayList; import java..
SpringBoot- 패치 조인 최적화 연관된 엔티티를 가져오는 경우 Order에는 Member와 Delivery 엔티티가 연관되어있다고 할 때, 현재 저장 되어있는 Order 엔티티와 Member, Delivery의 정보를 함께 가져와보자. 1) 최적화가 되어있지 않는 경우 (1+N 문제 발생) Member와 Delivery 엔티티는 Order와 양방향 매핑 되어있다. 내가 만일 Order 엔티티를 단순 join문 만을 이용한 쿼리문으로 조회를 한다고 하면 다음과 같이 쿼리가 발생할 것이다. public List findAllByString(OrderSearch orderSearch) { //language=JPQL String jpql = "select o From Order o join o.member m"; boolean isFirst..
SpringBoot- API API Mapping 어노테이션 API는 기본적으로 통신을 위한 것이고, 다양한 매핑 어노테이션을 사용한다. 기존에 봐왔던 @RequestMapping, @GetMapping등이 존재한다. @RequestMapping @GetMapping: 데이터를 가져오는 경우에 사용한다. @PostMapping: 가입, 생성 시에 사용한다. @PutMapping: POST와 유사하나 멱등성을 가진다. 전체 update가 필요한 경우에는 @PutMapping을 사용한다. 만일 부분 update가 필요한 경우에는 PUT 대신 POST를 사용한다. @DeleteMapping: 삭제시에 사용한다. API 설계 (1) - GetMapping API를 설계하는데 있어서 중요한 점은 절대로 엔티티 그 자체를 노출시키지 않는다는 ..
SpringBoot- @Valid, @ResponseBody, @RequestBody 유효성 검증 어노테이션 @NotNull : 해당 필드에 null값을 불허한다. @NotEmpty : 해당 필드에 null, ""을 불허한다. @NotBlank : 해당 필드에 null, "", " " 을 불허한다. 즉 최소 1글자 @Min : 해당 필드의 최소값을 벗어나는지 검증한다. @Max : 해당 필드의 최대값을 벗어나는지 검증한다. @Pattern : 해당 필드가 특정 형태를 가지도록 검증한다. (정규표현식으로 표현함) @Email : 해당 필드가 이메일 형식을 가지도록 검증한다. @Size : 문자열의 최소, 최대 크기를 검증한다. @Size(min=10, max=100) 과 같이 사용할 수 있으며, 기본값은 min=0, max=정수형의 최대값 이다. @Valid, @ResponseBody, @..
SpringBoot- @GetMapping, @PostMapping @GetMapping @GetMapping 어노테이션은 @RequestMapping 어노테이션의 method = RequestedMethod.GET의 축약형이다. @GetMapping("/") @RequestMapping(value = "/", method = RequestedMethod.GET) //same 예를 들어 다음 코드를 보자 MemberForm.java @Getter @Setter public class MemberForm { // Member를 위한 DTO @NotEmpty(message = "회원 이름은 필수입니다.") // 값이 없는 경우 에러발생함 private String name; private String city; private String street; private Stri..
SpringBoot- Controller MVC 패턴 컨트롤러에서는 model에서 데이터를 가져와 이를 뷰에 전달한다. 이를 MVC 패턴이라고 한다. Controller 1) HomeController 예시 HomeController.java package jpabook.jpashop.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @Slf4j // logger 생성: Logger log = (Logger) LoggerFactory.getLogger(getClass()); public cla..
SpringBoot- @Transactional 트랜잭션 트랜잭션 과정에서는 어떠한 동작이 완료되기 전까지 방해가 존재해서는 안된다. 예를 들어서 송금을 하는 일련의 트랜잭션이 있다고 하자. 그 과정은 송금자의 계좌에서 돈이 감소하고, 수신인의 계좌에선 돈이 증가해야한다. 만일 송금자의 계좌의 돈만 감소하고 수신인의 돈은 증가하지 않는 상황은 발생해서는 안된다는 것이다. @Transactional 스프링에서는 @Transactional 어노테이션을 지원한다. 이를 클래스 단위에 붙이면(클래스 선언위에 어노테이션을 사용하면) 해당 클래스의 메소드 모두 트랜잭션을 보장한다. 메소드 개별적으로도 사용이 가능한데 @Transactional에는 readOnly 설정을 할 수 있는데, 만일 어떠한 엔티티의 조회와 같이 데이터의 변경이 필요하지 않은 메소드에 re..
SpringBoot- 테스트 케이스 작성 예시 Member.class package jpabook.jpashop; import lombok.Getter; import lombok.Setter; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; } MemberRepository.class package jpabook.jpashop..