1) ORM이란?
💡 ORM: Object-Relational Mapping
Object: "객체"지향 언어 (자바, 파이썬)
Relational: "관계형" 데이터베이스 (H2, MySQL)

백엔드 개발자(Backend Developer): 웹 서버를 개발하는 개발자
DBA (Database Administration): 데이터베이스 관리자. 데이터베이스를 설치, 구성, 관리 등의 일을 맡은 사람
Questions)
ORM 이 없이 웹 서버 개발은 못 하나요?

그럼 이제 백엔드 개발자는 DB 에 대해 몰라도 되나요?
2) JPA는?
JPA: Java Persistence API
자바 ORM 기술에 대한 표준 명세

@Entity // DB 테이블 역할을 합니다.
public class User {
// ID가 자동으로 생성 및 증가합니다.
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
// nullable: null 허용 여부
// unique: 중복 허용 여부 (false 일때 중복 허용)
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false)
@Enumerated(value = EnumType.STRING)
private UserRoleEnum role;
@Column(unique = true)
private Long kakaoId;
}
Questions)
- JPA 가 없으면?
- 직접 SQL 문을 작성해서 구현 가능
- 예) AllInOneController 통한 신규 상품 등록
```java
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class AllInOneController {
// 신규 상품 등록
@PostMapping("/api/products")
public Product createProduct(@RequestBody ProductRequestDto requestDto) throws SQLException {
// 요청받은 DTO 로 DB에 저장할 객체 만들기
Product product = new Product(requestDto);
// DB 연결
Connection connection = DriverManager.getConnection("jdbc:h2:mem:springcoredb", "sa", "");
// DB Query 작성
PreparedStatement ps = connection.prepareStatement("select max(id) as id from product");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
// product id 설정 = product 테이블의 마지막 id + 1
product.setId(rs.getLong("id") + 1);
} else {
throw new SQLException("product 테이블의 마지막 id 값을 찾아오지 못했습니다.");
}
ps = connection.prepareStatement("insert into product(id, title, image, link, lprice, myprice) values(?, ?, ?, ?, ?, ?)");
ps.setLong(1, product.getId());
ps.setString(2, product.getTitle());
ps.setString(3, product.getImage());
ps.setString(4, product.getLink());
ps.setInt(5, product.getLprice());
ps.setInt(6, product.getMyprice());
// DB Query 실행
ps.executeUpdate();
// DB 연결 해제
ps.close();
connection.close();
// 응답 보내기
return product;
}
}
```
- 실제로 과거엔 JPA 없이 웹 서버를 개발한 기업이 많았고, 현재도 유효
- JPA 사용 트렌드?
- 과거엔 SQL 매퍼 (MyBatis, JdbcTemplate) 위주로 개발
- 전 세계적으로 JPA 사용 빈도가 급격히 높아져 **현재는 JPA 가 대세!!**
- 하이버네이트 (Hibernate)?
- JPA 는 표준 명세이고, 이를 실제 구현한 프레임워크 중 **사실상 표준**
- 스프링 부트에서 기본적으로 "하이버네이트" 사용 중
> 사실상 표준 (de facto, 디팩토)
보통 기업간 치열한 경쟁을 통해 시장에서 결정되는 비 공식적 표준이다
출처: [위키백과](https://ko.wikipedia.org/wiki/사실상_표준)
>