Spring 입문주차/2주차 11

11. SpringBoot의 JPA

Memo 프로젝트를 연다. build.gradle의 dependency에 아래의 코드를 추가한다. 그리고 코끼리 새로고침// JPA 설정implementation 'org.springframework.boot:spring-boot-starter-data-jpa' application.properties로 이동 후 아래의 코드 추가spring.jpa.hibernate.ddl-auto=updatespring.jpa.properties.hibernate.show_sql=truespring.jpa.properties.hibernate.format_sql=truespring.jpa.properties.hibernate.use_sql_comments=true Memo.java의 기존 코드를 전부 지우고 아래의 코드..

10. Entity의 상태

비영속(Transient)Memo memo = new Memo(); // 비영속 상태memo.setId(1L);memo.setUsername("Robbie");memo.setContents("비영속과 영속 상태");쉽게 말하자면 new 연산자를 통해 인스턴스화 된 Entity 객체를 의미한다. 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않는다.영속(Managed)em.persist(memo);persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만든다. @Test@DisplayName("비영속과 영속 상태")void test1() { EntityTransaction et = em.getTrans..

9. 영속성 컨텍스트의 기능

1차 캐시영속성 컨텍스트는 내부적으로 캐시 저장소를 가지고 있다. 우리가 저장하는 Entity 객체들이 1차 캐시 즉, 캐시 저장소에 저장된다고 생각하면 된다. 캐시 저장소는 Map 자료구조 형태로 되어있다. key에는 @Id로 매핑한 기본 키 즉, 식별자 값을 저장한다. value에는 해당 Entity 클래스의 객체를 저장한다. 영속성 컨텍스트는 캐시 저장소 Key에 저장한 식별자값을 사용하여 Entity 객체를 구분하고 관리한다. 영속성 컨텍스트가 이 캐시 저장소를 어떻게 활용하고 있는지 살펴보자Entity 저장em.persist(memo); 메서드가 호출되면 memo Entity 객체를 캐시 저장소에 저장한다. jpa-core 프로젝트 실행 테스트 폴더에 PersistenceTest 클래스 파일 만..

8. 영속성 컨텍스트란 무엇일까?

영속성 컨텍스트란?Persistence를 한글로 번역하면 영속성, 지속성 이라는 뜻이 된다. Persistence를 객체의 관점으로 해석해 보자면 '객체가 생명(객체가 유지되는 시간)이나 공간(객체의 위치)을 자유롭게 유지하고 이동할수 있는 객체의 성질'을 의미한다. 영속성 컨텍스트를 좀 더 쉽게 표현해 보자면 Entity 객체를 효율적으로 쉽게 관리하기 위해 만들어진 공간이다. 개발자들은 이제 직접 SQL을 작성하지 않아도 JPA를 사용하여 DB에 데이터를 저장하거나 조회할 수 있으며 수정, 삭제 또한 가능하다.이러한 일련의 과정을 효율적으로 처리하기 위해 JPA는 영속성 컨텍스트에 Entity 객체들을 저장하여 관리하면서 DB와 소통한다.EntityManager영속성 컨텍스트에 접근하여 Entity ..

7. Entity 이해하기

Entity란?JPA에서 관리되는 클래스 즉, 객체를 의미한다. Entity 클래스는 DB의 테이블과 매핑되어 JPA에 의해 관리된다.실습JPA는 Spring 환경에서 하는것과 Java환경에서 하는것은 좀 다르다 무엇이 다른지는 나중에 알려준댄다. 일단 지금은 Java 환경에서의 JPA이다.  resoureces 우클릭 - Directory - META-INF 그리고 META-INF 우클릭 - New - File -> persistence.xml 라고 이름지어서 만들기 persistencs.xml에 아래의 코드 넣기 com.sparta.entity.Memo ..

6. JPA란 무엇일까?

DB를 직접 다룰 때의 문제점애플리케이션에서 아래 형태의 객체 데이터를 DB에 저장해서 관리해야한다면 어떻게 해야 할까? public class Memo { private Long id; private String username; private String contents;}1. DB 테이블 만들기create table memo ( id bigint not null auto_increment, contents varchar(500) not null, username varchar(255) not null, primary key (id));2. 애플리케이션에서 SQL 작성String sql = "INSERT INTO memo (usernam..

5. IoC Container와 Bean

이전 강의를 통해 DI를 사용했을 때의 장점을 살펴 보았다. 그런데 DI를 사용하기 위해서는 객체 생성이 우선되어야 한다. 그렇다면 언제 어디서 누가 객체를 생성해야 할까? 바로 Spring 프레임워크가 필요한 객체를 생성하고 관리하는 역할을 대신 해준다. 빈(Bean) : Spring이 관리하는 객체 Spring IoC 컨테이너 : Bean을 모아둔 컨테이너 Bean으로 주입받고 있는 생성자나 메서드는 왼쪽에 커피콩 아이콘이 보인다.JdbcTemplate 객체MemoRepositroy의 생성자로 JdbcTemplate를 받는데, 이는 기본적으로 Spring에서 자동으로 주입해주는 Bean이다. 왼쪽에 커피콩 아이콘이 보이는것으로 확인할 수 있다.이전 강의에서 오류발생 부분, bean이 없다고 말한다. ..

4. 메모장 프로젝트의 IoC & DI

객체 중복 생성 문제 해결Memo Service를 보면 "new MemoRepository(jdbcTemplate);" 코드가 중복되는게 보인다.public class MemoService { private final JdbcTemplate jdbcTemplate; public MemoService(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public MemoResponseDto createMemo(MemoRequestDto requestDto) { // DB 저장 MemoRepository memoRepository = new MemoRepository(jdbcTempl..

3. IoC(제어의 역전), DI(의존성 주입) 이해하기

Spring의 IoC와 DIIoC, DI는 객체지향의 SOLID 원칙 그리고 GoF의 디자인 패턴과 같은 설계 원칙 및 디자인 패턴이다. 이 둘을 더 자세하기 구분해 보자면 IoC는 설계 원칙에 해당하고 DI는 디자인 패턴에 해당한다. 요리로 비유해보면설계 원칙을 요리로 비유하기 신선한 재료를 사용한다. 신 김치를 사용한다. 밥과 김치의 비율을 잘 맞춰야 한다. 볶을 때 재료의 순서가 중요하다.디자인 패턴을 요리로 비유하기 오일을 두른 팬에 채썬 파를 볶아 파기름을 만든다. 준비한 햄을 넣고 볶다가, 간장 한스푼을 넣어 풍미를 낸다. 설탕에 버무린 김치를 넣고 함께 볶는다. 미리 식혀 둔 밥을 넣어 함께 볶는다. 참기름 한스푼을 넣어 마무리한다.좋은 코드란 무엇일까?논리가 간단해야 한다. 중복을 제거하고..

2. 역할 분리하기

Memo 프로젝트에 다시 들어가서 com.sparta.memo 안에  service 패키지를 만든다. 그 패키지 안에 Memoservice class를 만든다. MemoController 클래스로 이동 -> createMemo 메서드로 이동메서드 내용에 해당 코드를 추가한다. 그 후 Memoservice클래스의 createMemo 메서드를 만들기 위해 다시 Memoservice 클래스로 이동하고 아래처럼 메서드를 만들어준다. Controller의 반환 타입이 MemoResponseDto이고 그 return 값으로 service의 createMemo의 메서드 반환값을 반환하니 service 부분의 createMemo 메서드도 MemoResponseDto를 반환해줘야 한다. 그리고 기존의 Controller..