참고 : 인프런 스프링 입문 - 김영한스프링 복습 겸 토이 프로젝트를 진행해보고자 김영한님의 강의를 시작했다.필요 개발환경 스프링부트 3.0 이상자바 17이상IntelliJ or Eclipse 이전 내 맥북에 깔려 있던 자바는 11버전이 었기에 java17을 새로 설치
참고 : 인프런 스프링 입문 - 김영한Gradle의 Dpendencies는 라이브러리간의 의존관계를 보여준다.프로젝트를 생성할 때 우리는 Spring Boot Starter Web 과 Spring Boot Sterter Thymeleaf 두 가지만 선택해여 추가하였지만
📹 참고 : 인프런 스프링 입문 - 김영한 스프링부트는 resources/static/index.html 를 welcome page로 지정한다. (도메인만 누르고 들어왔을 때 첫 화면)📄 공식문서(https://docs.spring.io/spring-b
📹 참고 : 인프런 스프링 입문 - 김영한 💡 정적컨텐츠 : 서버를 통한 것이 아닌 파일(html) 그대로 웹 브라우저에 띄우는 형식💡 MVC 와 템플릿 엔진 : 과거의 JSP, PHP 와 같이 HTML을 그냥 웹브라우저에 띄우는 것이 아닌 서버에서 프로그래밍을
📹 참고 : 인프런 스프링 입문 - 김영한 스프링부트를 이용하여 회원 관리 예제를 만들어 보자.데이터: 회원ID, 이름기능: 회원 등록, 조회아직 데이터 저장소가 선정되지 않음(가상의 시나리오)/java/hello.hellospring.domain/Memberjav
📹 참고 : 인프런 [ 스프링 입문 - 김영한 ] 서비스 부분을 구현해 보자. 서비스 클래스의 네이밍은 비즈니스에 가까운 용어를 사용한다. hello/hellospring/service/MemberService.java 회원가입, 전체 회원 조회, 회원 아이디
📹 참고 : 인프런 스프링 입문 - 김영한 지금까지 리포지토리, 서비스를 만들어 보았다. 로직을 화면에 붙이기 위해서는 컨트롤러와 뷰 템플릿이 필요한데, 이번에는 컨트롤러에 대해 알아보자.멤버 컨트롤러에서 멤버 서비스를 이용하여 회원가입하고, 데이터를 조회할 수 있
📹 참고 : 인프런 스프링 입문 - 김영한 java/hello/hellospring/controller/HomeController.javaresources/templates/home.htmlindex.html이 연결되지 않는 이유는 스프링 컨트롤러 안을 우선으로 찾
📹 참고 : 인프런 [ 스프링 입문 - 김영한 ] H2 DataBase 설치 장점 : 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공 > 설치 방법 https://www.h2database.com 다운로드 및 설치 스프링 부트 버전에 맞춘다. 압축해제된
📹 참고 : 인프런 스프링 입문 - 김영한 자바는 DB와 연결해서 데이터 입출력 작업을 할 수 있도록 JDBC 라이브러리 (java.sql패키지) 제공JDBC는 DBMS의 종류와 상관없이 동일하게 사용할 수 있는 클래스와 인터페이스 제공JDBC 인터페이스를 구현한
📹 참고 : 인프런 스프링 입문 - 김영한 JPA(Java Persistence API)는 자바 표준 ORM(Object-Relational Mapping) 기술.ORM은 객체(Object)와 관계형 데이터베이스(Relational Database) 간의 매핑을 자
📹 참고 : 인프런 스프링 입문 - 김영한 스프링 데이터 JPA(Spring Data JPA)는 스프링 프레임워크에서 JPA를 더 쉽게 사용할 수 있도록 지원하는 프로젝트입. JPA를 기반으로 데이터 액세스 계층을 구현할 때 반복적이고 지루한 작업을 줄여주는 간편한
📹 참고 : 인프런 스프링 입문 - 김영한 AOP : Aspect Oriented Programming (관점 지향 프로그래밍)핵심코드의 변화없이 부가 코드(공통기능)를 원하는 곳에 뺏다 붙였다 할 수 있는 기능.즉, 공통 관심 사항(cross-cutting con
참고 : 인프런 < 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 >스프링 입문 강의를 마치고 활용 예제를 통해 스프링을 익혀보자.스프링 입문과 동일하게 스프링 부트 스타터를 활용한다.⏱️ 스프링입문 프로젝트 생성 복습초기설정GradleJ
참고 : 인프런 테스트를 진행하여 로그를 통해 쿼리를 확인할때 파라미터는 ?로 남게된다. 이러한 파라미터도 확인하는 방법을 알아보자. application.yml 수정 로깅 설정을 수정 후 테스트를 다시 실행하면 처럼 파라미터를 확인할 수 있다. --
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.객체는 참조를 사용해서 연관된 객체를 찾는다.테이블과 객체 사이에는 이러한 큰 간격이 있다.mappedBy = JPA의 멘붕 클래스
참고 : 인프런 기능 목록 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문 내역 조회 주문 취소 기타 요구사항 상품은 재고 관리가 필요하다. 상품의 종류는 도서

자바와 같은 객체지향에서는 클래스끼리 상속관계가 존재하지만, 관계형 데이터베이스는 상속관계를 지원하지 않는다.=> 관계형 데이터베이스는 슈퍼타입 서브타입 논리모델 관계 모델링 기법을 통해 객체의 상속관계를 매핑할 수 있음.3가지 전략을 통해 매핑하기 위해서는 부모 클래
다대다 관계는 하나의 엔티티가 여러 다른 엔티티와 관계를 맺을 수 있고, 반대로 다른 엔티티도 여러 엔티티와 관계를 맺을 수 있는 상황을 말합니다. 이러한 관계를 데이터베이스에 저장하기 위해서는 별도의 연결 테이블이 필요name : 연결 테이블의 이름joinColumn
참고 : 인프런 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ] >참고 예제에서는 설명을 쉽게하기 위해 엔티티 클래스에 Getter, Setter를 모두 열고, 최대한 단순하게 설계 실무에서는 가급적 Getter는 열어두고, Setter
참고 : 인프런 < 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 >강의에서는 예제를 보이기 위해 Setter을 사용하였지만,실무에서는 추후 유지보수가 어렵기 때문에 가급적 사용하지 않는다.즉시로딩( EAGER ) : 엔티티를 조회할 때
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]~/repository/MemberRepository.java@PersistenceContextJPA에서 엔티티 매니저를 주입받기 위해 사용되는 어노테이션스프링 프레임워크의
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]테스트는 케이스 격리된 환경에서 실행하고, 끝나면 데이터를 초기화하는 것이 좋다. 그런 면에서 메모리 DB를 사용하 는 것이 가장 이상적이다.\-> 데이터베이스를 따로 설치하
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]이번에는 상품 엔티티 자체에 비즈니스 로직을 추가해보자. (도메인 주도 설계)\-> 객체 지향적~/domain/Item.javaItem 엔티티가 StockQauntity 정보
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]Order의 경우 Order 뿐만 아니라 OrderItem, Delivery 등과 복잡한 연관관계를 가지고 있다. 그렇기 때문에 생성 메서드를 별도로 가지는 것이 좋다.~do
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]orderItem 과 delivery를 각각 repository를 사용하여 save한 후 createOrder에 넘겨주지 않고, createOrder에 order만 save하
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]구현 기능 중 주문 목록에서 회원명과 주문 상태로 필터링하여 조회하는 기능이 있다.이것은 동적 쿼리로 구현해야한다.우선 검색 조건 파라미터 클래스를 생성하자위 코드는 무조건
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]controller 패키지 생성HomeController 생성home() 메서드 생성 : home.html 리턴@Slf4j 어노테이션Lombok 라이브러리에서 제공하는 애노테
참고 : 인프런 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ] MemberForm 클래스 생성 > @NotEmpty 오류 발생 유효성 검사를 해주는 어노테이션 비어있으면 오류 강의 자료와 똑같이 작성하였지만 어노테이션이 적용되지
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]th:each="member : ${members}" ${members}는 members라는 List<Member>을 반복하면서 각 항목을 member 변수에 바인딩m
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]실무에서는 Stter을 제거하고 createbook 과 같은 static 생성자 메서드를 가지고 설계하는 것이 좋다.상품 등록 후 디비 콘솔에서 저장된 것을 확인 할 수 있다
참고 : 인프런 \[ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]@PathVariable 어노테이션Spring MVC에서 사용되는 어노테이션URL 경로의 일부를 메소드 매개변수로 바인딩할 때 사용RESTful 웹 서비스에서 클라이언트가 보
참고 : 인프런 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]
참고 : 인프런 [실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ] OrderController >@RequestParam 스프링 어노테이션 HTTP 요청 파라미터를 메서드의 파라미터로 바인딩할 때 사용 로 GET 요청의 쿼리 파라미터나
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한https://www.postman.com/downloads/템플릿 엔진을 사용해서 렌더링하는 컨트롤러와 API 스타일의 컨트롤러 패키지를 분리하자.공통으로 예외 처리 등
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한MemberService@AllArgsConstructor 어노테이션Lombok 라이브러리에서 제공하는 어노테이션클래스의 모든 필드를 사용하는 생성자를 자동으로 생성@AllArgs
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한한번 넣은 데이터를 계속 사용하기 위해서 ddl-auto : none으로 변경 테스트용 회원을 넣어준다.엔티티를 DTO로 변환해서 반환한다.엔티티가 변해도 API 스펙이 변경되지
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한application.yml의 ddl-auto 를 create로 다시 변경해주자. (테이블 드랍하고 다시 생성)@Component: Spring의 컴포넌트 스캔 기능을 통해 빈으로
참고 : [실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한 엔티티를 직접 노출하는 방법으로 주문 조회를 구현해보자. 해당 방법은 실무에서 절!대! 추천하지 않는다. OrderSimpleApiController 생성 > API 핵심 기능
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한이번에는 엔티티 직접 노출이 아닌 정석 방법으로 DTO로 변환하여 반환해보자!OrderSimpleApiControllerorderRepository.findAllByString(n
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한V2, V2의 경우 엔티티를 조회해서 DTO로 중간에 변환하는 방식이었다.이번에는 JPA에서 DTO로 바로 끄집어내어 조회하는 방법을 알아보자.이전 버전의 SimpleOrderDt
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한앞의 예제에서는 toOne(OneToOne, ManyToOne) 관계만 있었다. 이번에는 컬렉션인 일대다 관계(OneToMany) 를 조회하고, 최적화하는 방법을 알아보자.기존 주
참고 : [실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한이번에는 N + 1 문제를 해결하는 패치조인으로 주문조회 API를 만들어보자.OrderApiControllerOrderRepository \-distinct를 사용한 이유는 1대다
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한V3에서 컬렉션을 페치 조인하면 페이징이 불가능하다.컬렉션을 페치 조인하면 일대다 조인이 발생하므로 데이터가 예측할 수 없이 증가한다.일다대에서 일(1)을 기준으로 페이징을 하는
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한이번에는 컬렉션이 있는 주문 조회에서 DTO를 직접 조회하는 방법을 알아보자.OrderApiControllerOrderRepository는 Order 엔티티를 조회하는 용도로 쓰이
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한이번에는 데이터를 한꺼번에 처리할때 많이 사용하는 방식이다.쿼리 1번을 날릴때 컬렉션도 한번에 조회한다. (in쿼리 사용)OrderApiControllerOrderQueryRepo
참고 : \[실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한이번에는 쿼리 1개로 모든 데이터를 조회해보자.DB에서 한번에 다 가져옴Order 와 OrderItem , Item JOIN (flat 하게 한줄로) OrderApiControll
Open Session In View: 하이버네이트 (JPA등장 전)Open EntityManager In View: JPAspring.jpa.open-in-view : true 기본값스프링부트 애플리케이션을 실행하면 WARN 35782 --- \[ restarted