프로젝트 환경 세팅
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를 작성해줍니다.
실습
- 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’ 가 실행된 걸 확인할 수 있다.
- database → new sqlite → ‘db.sqlite’ 생성
→ table이 생성된걸 확인할 수 있다.
실행해보면 db에 ‘students’ 테이블이 생성된걸 확인할 수 있다.
ddl-auto:
- ddl-auto 옵션들
- none : 사용하지 않음
- create : 기존 테이블 삭제 후 테이블 생성
- create-drop : 기존 테이블 삭제 후 테이블 생성, 종료 시점에 테이블 삭제
- update : 변경된 스키마 적용
- validate : 엔티티와 테이블 정상 매핑 확인
지금은 create라고 했기때문에 아래 두 문을 실행 한다
실행