TIL

day36 TIL

dalooong 2023. 7. 9. 13:17

프로젝트 환경 세팅

2. sqlite를 사용하기 위해 build.gradle 설정을 해주어야한다.

'dependency' 밑에 추가해준 뒤 gradel 해주기

// gson
    implementation 'com.google.code.gson:gson:2.10.1'

// sqlite
    runtimeOnly 'org.xerial:sqlite-jdbc:3.41.2.2'
    runtimeOnly 'org.hibernate.orm:hibernate-community-dialects:6.2.4.Final'

3. application.properties를 -> application.yaml로 rename한다.

그 뒤 sqlite 생성하는 코드를 작성해준다.

spring:
  datasource:
    url: jdbc:sqlite:db.sqlite
    driver-class-name: org.sqlite.JDBC
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    database-platform: org.hibernate.community.dialect.SQLiteDialect

4. 프로그램 실행해보면 'db.sqlite' 파일이 생성된 걸 확인할 수 있다.

 

Stereotype이란?

구현된 기능상의 차이도 있지만 주된 목적은 역활의 표시

  • 해당 클래스가 어떤 역할을 하는지 명확히 확인 가능
  • Annotation 기반 관점 지향 프로그래밍

⇒ 실제 구현보다 역할적인 구분에 초점이 맞춰져 있다.

@Component

AppComponent 클래스 생성

@Component 추가

@Component
public class AppComponent {
    //Controller, Service, Repository가 아닌
    //평번한 Bean 객체
    //외부 API 사용, 공유된 기능 개발, 그냥 IoC 등록하고 싶은 객체
}

AppController 클래스 생성

@Controller : 사용자의 입력을 받는 요소이다. 주로 @RequestMapping과 함께 사용한다

@RequestMapping("students") 추가

@RestController
//모든 메소드에 @ ReponseBody를 붙이는 용도
public class AppController {
    //사용자의 입력을 받는 요소

    //RequestMapping과 같이 사용
    @RequestMapping("students")
    public void students(){

    }

    @GetMapping("home")
    public String home(){
        return "home";
    }

    @GetMapping("body")
    public @ResponseBody String body(){
        return "body";

    }
}

@ResponseBody & @RestController의 차이

  • @Controller의 @RequestMapping은 HTML을 응답한다.
  • 하지만 백엔드가 항상 HTML만 반환하는 건 아니다
@GetMapping("home")
    public String home(){
        return "home";
    }

    @GetMapping("body")
    public @ResponseBody String body(){
        return "body";
    }
}
  • 메소드에 @ResponseBody가 추가되면 데이터 응답 → 데이터를 돌려준다
  • 클래스에 @RestController가 추가되면, 모든 메소드에 @ResponseBody 추가
  • @RestController : 모든 메소드에 @ ReponseBody를 붙이는 용도

AppService 클래스 생성 후 @Service 작성

  • @Service는 주된 비즈니스 로직이 구현되는 공간임
@Service
public class AppService {
    //주된 비즈니스 로직이 구현되는 공간
    //Controller -> Service
    // Service
    //1. 데이터베이스 조회
    //2. Component 사용
    //3. 모든 데이터를 가지고 응답
}

AppRepository클래스 생성 후 @Repository 작성

  • @Repository는 데이터베이스와의 소통을 담당한다.
@Repository
public class AppRepository {
    // 데이터베이스와의 소통을 담당
    //@Transactional
}
  • 준비
@Service
public class AppService {
    private final AppRepository repository;
    
    public AppService(AppRepository repository){
        this.repository = repository;
    }

@Configuration

프로젝트 내부에서 사용하기 위한 필요한 다양한 설정을 담고 있는 요소

@Bean

메소드의 결과를 Bean 객체로 관리하고 싶을 때

AppConfigData 클래스 생성 -> @RequiredArgsConstructor

@RequiredArgsConstructor
public class AppConfigData {
    private final String connectionUrl;

}

JPA 시작

ORM (Object Relational Mapping)

우리가 사용하는 언어는 객체지향 프로그래밍 언어

  • 객체와 객체가 상호작용한다.
  • 또 하나의 객체가 다른 객체를 소유한다.

관계형데이터베이스에서는?

  • 한 컬럼에 다른 객체에 대한 정보를 직접 다를 수 없음
  • 조회 후 별도로 Join이 필요

JPA와 Hibernate

  • JPA란 ?

Java Persistence API의 약자로, 현재는 Jakarta Persistence API를 의미합니다.

어떤 JAVA 객체가 관계형 데이터베이스에 어떻게 매핑이 이뤄지는지를 표현하기 위한 명세 방식

@Entity
public class StudentEntity {}  // 이 객체가 데이터베이스 엔티티임을 표시
  • Hibernate 란?

이런 JPA의 명세를 바탕으로 데이터베이스를 활용할 수 있게 해주는 ORM프레임 워크 입니다.

즉, 저희가 JPA가 제공하는 어노테이션을 객체에 부여하면,Hibernate가 해당 어노테이션을 확인해서 데이터베이스에 필요한형태로 적용시켜주는 역할을 하는 것입니다.

그리고 JPA와 Hibernate를 추상화해서 SpringBoot에서 활용할 수 있게 해주는 의존성이 바로 SpringDataJpa 프로젝트입니다. 따라서 저희가 SpringBoot에서 JPA를 활용하고자 한다면, SpringBoot JPA의존성을 추가해주면 됩니다.

Hibernate는 저희를 대신해서 SQL를 작성해줍니다.

실습

  1. Entity 작성하기 StudentEntity 클래스 작성 후 @Data, @Entity, @Id, @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션 생성
@Data
@Entity
public class StudentEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;
    private String phone;
    private String email;

}

실행 했더니 ‘Hibernate’ 가 실행된 걸 확인할 수 있다.

아이콘이 그냥 파일에서 데이터베이스파일로 인식하여 DB파일로 로고가 바뀌었다.

  1. database → new sqlite → ‘db.sqlite’ 생성

→ table이 생성된걸 확인할 수 있다.

실행해보면 db에 ‘students’ 테이블이 생성된걸 확인할 수 있다.

ddl-auto:

  • ddl-auto 옵션들
    • none : 사용하지 않음
    • create : 기존 테이블 삭제 후 테이블 생성
    • create-drop : 기존 테이블 삭제 후 테이블 생성, 종료 시점에 테이블 삭제
    • update : 변경된 스키마 적용
    • validate : 엔티티와 테이블 정상 매핑 확인

지금은 create라고 했기때문에 아래 두 문을 실행 한다

실행