스프링) JPA Entity option 지연 로딩/영속성 전이/고아 entity삭제 (23-07-12)
velog에서 이전한 글 입니다. 2023.07.13 - [spring] - 스프링) JPA Entity 연관관계 - 외래 키 주인 (23-07-11) 지난 포스팅에 이어 JPA Entity Option FetchType EAGER/LAZY (지연 로딩) public @interface ManyToOne{ ... FetchType fetch() default FetchType.EAGER; ... } public @interface OneToMany{ ... FetchType fetch() default FetchType.LAZY; ... } EAGER는 첫 select와 동시에 join으로 참조 항목을 가져온다. LAZY는 첫 select에서 join을 하지않고 참조가 필요할 때 추가로 select를 요..
2023.07.14
스프링) JPA Entity 연관관계 - 외래 키 주인 (23-07-11)
velog에서 이전한 글 입니다. Entity 연관관계 공통 외래 키의 주인만이 외래 키를 등록,수정,삭제 할 수 있다. 외래 키의 주인은 테이블에 외래 키 컬럼이 생성되는 Entity를 말한다. 주인이 아닌 쪽은 오직 외래 키 읽기만 가능하다. 외래 키의 주인은 @JoinColumn(name = 컬럼명)를 사용하고 (양방향이라면) 반대편은 (mappedBy = 외래 키의 주인에서 '나'를 가르키는 필드명)을 사용한다. '나'를 가르키는 컬럼명이 아니라 필드명이다. JoinColumn의 컬럼명이 아니라 필드명이란 거 필드명 = 자바 객체 필드 컬럼명 = db 컬럼 단방향,양방향 하나를 예시로 보자 public class Food { @Id @GeneratedValue(strategy = Generatio..
2023.07.14
스프링) Spring Boot의 JPA @Transactional/SimpleJpaRepository (23-07-09)
velog에서 이전한 글 입니다. 2023.07.13 - [spring] - 스프링) JPA persistence/트랜잭션/Entity상태 (23-07-08)앞의 포스팅에서 jpa를 다루던 것은 hibernate-core이다.implementation 'org.hibernate:hibernate-core:6.1.7.Final'이번엔 spring boot에서 jpa를 어떻게 다루는지 살펴보자.Spring에서 JPAimplementation 'org.springframework.boot:spring-boot-starter-data-jpa'data-jpa 를 사용한다. 그냥 java에선 xml파일로 설정하고 EntityManager, EntityManagerFactory 를 직접 만들었지만 Springboot..
2023.07.14
스프링) JPA persistence/트랜잭션/Entity상태 (23-07-08)
velog에서 이전한 글 입니다. JPA Persistence Context 영속성 컨텍스트 : Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간이다. 객체의 생명(유지되는 시간)이나 공간(위치)을 유지하고 이동한다. 영속성 컨텍스트에 접근하고 조작하기 위해선 EntityManager가 필요하고 EntityManagerFactory를 통해 생성하여 사용할 수 있다. EntityManagerFactory는 일반적으로 DB 하나에 하나만 생성되어 애플리케이션이 동작하는 동안 사용된다. (Spring boot jpa를 사용하기 전에는 /resources/META-INF/ 위치에 persistence.xml 파일을 만들어 정보를 넣어둔다.) EntityManagerFactory emf = Pers..
2023.07.14
스프링) Spring jpa 순환참조 (23-07-07)
velog에서 이전한 글 입니다. 순환참조 다음과 같은 ERD가 있다. 등록된 book을 findAll한다고 했을 때 문제가 발생한다. List all = bookRepository.findAll(); System.out.println(all); Book entity에 @ToString 을 적용했다면 println에서 자동으로 toString이 동작한다. 예상한 결과는 [ { "id": 1, "title": "자바의정석", "author": "남궁성", "price": 10000, "stock": 10, "bookStore": { "id": 1, "name": "스파르타 서울", "address": "서울시 강남구" }, "purchase" : { "id" : 1, "member" : { ... .. }..
2023.07.13
스프링) Spring boot dto/lombok/validation (23-06-30)
velog에서 이전한 글 입니다. DTO/LomBoK @Getter public class UserSignUpDto { ... private boolean admin = false; ... } boolean @getter 는 isAdmin() 으로 작성된다. boolean값은 is로 시작하는게 보통이다. ex) OptionalType.isEmpty()/isPresent() @Getter @Setter @ToString(callSuper = true) public class PostUpdateDto extends PostUserDto { private Optional title; private Optional contents; public PostUpdateDto(String username, String..
2023.07.13
스프링) Spring Security Authentication/Authorization (23-06-29)
velog에서 이전한 글 입니다.FilterSpring의 life cycle이다.SecuritySpring Security도 많은 filter로 구성 돼있다.Security의 목적은 controller에서 인증/인가를 분리하고 filter단에서 손쉽게 처리하기 위함이다. 인증 - 해당 유저가 실제 유저인지 인증인가 - 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인 Authentication - 회원확인 로그인 JWT발급(Payload에 user정보)Authorization - JWT검증 및 인가 관련 작업(Role_Blabla) Security의 인가는 @Secured같은 어노테이션으로 기능할 수 있다.implementation 'org.springframework.boot:spring-boot..
2023.07.13
스프링) Spring boot ExceptionHandler/ Optional (23-06-28)
velog에서 이전한 글 입니다. ExceptionHandler @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity postPatchHandle(IllegalArgumentException e){ HttpStatus httpStatus = HttpStatus.BAD_REQUEST; ExceptionResponseDto response = new ExceptionResponseDto(httpStatus, e.getMessage()); return new ResponseEntity(response, httpStatus); } ExceptionHandler가 속해있는 controller에서 Handler에 명시된 예외 발생시 동작한다..
2023.07.13
스프링) Spring boot Request data (23-06-26)
velog에서 이전한 글 입니다. RequestParam (1) @PostMapping("/test3") public String p2(@RequestParam PostRequestDto requestDto) { System.out.println(requestDto.toString()); return ""; } (2) @PostMapping("/test") public String p(PostRequestDto requestDto) { System.out.println(requestDto.toString()); return ""; } application/x-www-form-urlencoded 타입 헤더에 dto로 받을 때 (1)은 못 들어오고 (2)는 잡힌다. (Dto는 setter있어야 잡힌다.) d..
2023.07.13