Spring/JPA 8

[Spring] 개념 정리

`스프링 핵심 원리 - 기본편` 강의를 듣고 정리한 자료입니다 ✨ 객체 지향 특징 1. 추상화 2. 캡슐화 3. 상속 4. 다형성 - 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있다 - 스프링은 객체 지향의 특징인 `다형성`을 살리는 좋은 객체 지향 개발 프레임워크이다 ✨ 다형성 개념 - 하나의 객체가 여러 가지 타입을 가질 수 있는 것 -> 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 탑의 인스턴스를 참조할 수 있도록 하여 구현하였다 - 역할 (인터페이스) 와 구현 (인터페이스 구현 클래스, 구현 객체) 으로 구분 - 쉽게 말하면 갈아끼우는 것이라 생각하면 된다 - 자바에서는 `오버라이딩`으로 다형성을 구현하였다 - 다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하..

Spring/JPA 2024.01.12

[Spring] 로그인 (쿠키, 세션)

✨ 쿠키 개념 - 사용자가 웹사이트에 접속 시 사용자의 개인 장치(컴퓨터 메모리)에 다운로드되고 브라우저에 저장되는 작은 텍스트 파일 - 사용자 인식 및 일부 데이터를 저장하기 위해 사용된다 구현 - 로그인 성공 시 서버가 쿠키에 사용자의 정보를 넣어준다 - 클라이언트 : 쿠키와 함께 요청을 보냄 - 서버 : 쿠키를 통해 인증·인가 진행 cf) 인증 : 유저가 누구인지 확인하는 절차 (회원가입, 로그인) cf) 인가 : 유저에 대한 권한을 허락하는 것 생성 public void login(... HttpServletResponse response) { Cookie cookie = new Cookie("userId", String.valueOf(user.getId())); cookie.setMaxAge(6..

Spring/JPA 2024.01.10

[스프링] JPA_S7 : 쿼리 파라미터와 변경 감지 & 병합

`실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발` 강의를 듣고 정리한 자료입니다 ✨ @PathVariable @GetMapping("/items/{itemId}/edit") public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) { Book item = (Book) itemService.findOne(itemId); // 예제 단순화를 위해 캐스팅 사용 BookForm form = new BookForm(); form.setId(item.getId()); ... } - {itemId} 는 변경될 수 있기 때문에 @PathVariable로 itemId을 가져다 써야 한다 @PostMapping("items/..

Spring/JPA 2024.01.09

[스프링] JPA_S6 : 주문 도메인 개발 (테스트 코드, 리다이렉트, Valid)

`실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발` 강의를 듣고 정리한 자료입니다 ✨ 주문상품 엔티티 개발 생성 메소드 - 여러 연관관계가 얽혀 있으면 복잡해짐 -> 복잡한 생성은 별도의 메소드가 있으면 좋다 - 생성하는 시점을 수정 해야 하는 상황이면 생성 메소드만 찾아 수정하면 되므로 편리하다 가변인자 - `...` 문법을 통해 여러 개를 넘긴다 // ex public static Order createOrder (OrderItem... ordrerItems) { } - 생성 메소드, 비즈니스 로직, 조회 로직 구분 시 편리하다 ✨ 주문 리포지토리 개발 public Order findOne(Long id) { return em.find(Order.class, id); } - em.find..

Spring/JPA 2024.01.08

[Spring] 스프링 패턴, JPA 기본 개념과 스프링 패키지 정리

✨ 트랜잭션 스크립트 패턴 정의 - All-or-Nothing - 하나의 트랜잭션으로 구성된 로직을 단일 함수 or 단일 스크립트에서 처리하는 구조 - ex, 은행 계좌 이체 서비스 -> `잔고 확인 -> 받는 사람 확인 -> 이체 실행 -> 잔고 감소`가 하나의 로직으로 처리되어야 함 - 모든 과정이 성공해야 완료 처리가 된다 장점 - 구현이 매우 쉬움 - MVC 패턴과 함께 사용 시에도 단순함이 유지된다 단점 - 비즈니스 로직이 복잡해질수록 코드가 난잡해진다 - 도메인에 대한 분석/설계 개념이 약하므로 코드의 중복 발생 문제가 생길 수 있다 - 쉬운 개발에 익숙해져 공통된 코드를 공통 모듈로 분리하지 않고 `ctrl c v`에 익숙해짐 ✨ 도메인 모델 패턴 도메인 - 해결하고자 하는 문제의 영역 - ..

Spring/JPA 2023.11.23

[스프링] JPA_S5 : 상품 도메인 개발

`실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발` 강의를 듣고 정리한 자료입니다 ✨ 상품 엔티티 개발 (비즈니스 로직 추가) 도메인 주도 설계 - 엔티티 안에 비즈니스 로직을 넣는 것이 효과적이다 => 객체지향적 설계 데이터를 가지고 있는 곳에서 비즈니스 로직이 나가는 것이 응집도가 있다 ✨ EntityManager - em.persist() : 영속성 컨텍스트에 추가 - em.merge() : 업데이트 - 아이템은 JPA에 저장하기 전까지 id 값이 없다 (새로 생성한 객체) - 원하는 값이 여러 개 있는 경우 JPQL을 작성해야 한다 return em.createQuery("select i from Item i", Item.class) .getResultList(); ✨ 질문 - Rep..

Spring/JPA 2023.11.14

[스프링] JPA_S4 : 회원 도메인 개발

`실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발` 강의를 듣고 정리한 자료입니다 ✨ 회원 리포지토리 개발 @PersistanceContext - JPA가 제공하는 표준 애노테이션 - EntityManager 위에 @PersistanceContext 애노테이션을 달게 되면 스프링이 EntityManager 생성 및 주입을 자동으로 해준다 - `@Autowired` 대신 `@PersistanceContext`를 써야 injection 가능 // 엔티티 매니저 팩토리 직접 주입 @PersistenceUnit private EntityManagerFactory emf; findAll() public List findAll() { return em.createQuery("select m from M..

Spring/JPA 2023.11.14

[스프링] JPA_S2 : 도메인 분석 설계

`실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발` 강의를 듣고 정리한 자료입니다 ✨ 도메인 모델과 테이블 설계 - 일대다 관계에서는 대부분 '다' 에 외래키 존재 - 외래 키가 있는 곳을 연관관계의 주인으로 정할 것 -> 주인 쪽에 값을 세팅해야 값이 변경된다 - 다대다 관계 사용을 지양할 것 내장 타입 - @Embeddable : JPA의 내장 타입 - 사용 시 @Embedded : 내장 타입 포함 - Embeddable or Embedded이지만 둘다 해주는 경우가 많다 Order - 관례로 order이 되는 것을 방지하기 위해 에노테이션 추가 -> @Table(name = "orders") 관계 설정 - 반대인 관계로 설정할 것 // ex) @OneToMany private List ..

Spring/JPA 2023.11.06