์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Android Studio
- 2024-08-21
- ์ฝ๋์
- IOC
- ์ด๋ ธํ ์ด์
- Factory Method Pattern
- Python
- uri
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
- menutab
- udp
- ๊ธฐ์ด100์
- OpenAPI
- ์ฑ์ฉํ์ ํ
- tcp
- ํ๋ IT&E
- url
- fontstyle
- reflection
- 2024-08-20
- Kotlin
- di
- swagger
- OOP
- FACTORY
- AndroidStudio
- http method
- Dialog
- URN
- datepicker
dingdong coding
JDBC vs JDBC Template vs JPA ๋ณธ๋ฌธ
JDBC (Java Database Connectivity)
โข JDBC๋ DB์ ์ ๊ทผํ ์ ์๋๋ก Java์์ ์ ๊ณตํ๋ ํ์ค API์ ๋๋ค.
โข ์ฆ, ๋ชจ๋ Java DataAccess ๊ธฐ์ ์ ๊ทผ๊ฐ์ด๋ฉฐ ๋ชจ๋ Persistence Framework๋ ๋ด๋ถ์ ์ผ๋ก JDBC API๋ฅผ ์ฌ์ฉํฉ๋๋ค.

build.gradle ์ค์
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'
๊ทธ ๋ค์ ์ด๋ค DBMS๋ฅผ ์ฌ์ฉํ๋์ง์ ๋ฐ๋ผ ์ฐ๊ฒฐ ์ค์ ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
JDBC๋ฅผ ์ด์ฉํด ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ ์ฝ๋
- Connection์ผ๋ก ์ฐ๊ฒฐํ๊ธฐ
- ์ฟผ๋ฆฌ๋ฅผ ์์ฑ ํ PreparedStatement๋ก ์คํํ๊ธฐ
- resultSet์ ์ด์ฉํ์ฌ ๊ฒฐ๊ณผ ์ฒ๋ฆฌํ๊ธฐ
- Connection ๋ซ์์ฃผ๊ธฐ
@Override
public Member save(Member member) {
String sql = "insert into member(name) values(?)";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, member.getName());
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
if (rs.next()) {
member.setId(rs.getLong(1));
} else {
throw new SQLException("id ์กฐํ ์คํจ");
}
return member;
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs); }
}
@Override
public Optional<Member> findById(Long id) {
String sql = "select * from member where id = ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return Optional.of(member);
} else {
return Optional.empty();
}
} catch (Exception e) {
throw new IllegalStateException(e);
} finally {
close(conn, pstmt, rs);
}
}
์ด์ฒ๋ผ JDBC API๋ฅผ ์ง์ ์์ฑํ๋ฉด ์ฐ๊ฒฐ๋ถํฐ ํด์ ๊น์ง ๋ํ ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ๋ง์ด ์๊ธด๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ง๊ธ๊น์ง ํ๋ถ์์ ์ ๊ต๋ด์์ ํ๋ Java ํ๋ก์ ํธ๋ฅผ ์๊ฐํด๋ณด๋ฉด JSP๋ก ๊ฑฐ์ ์์ JDBC ์ฝ๋๋ก ๊ฐ๋ฐํ๋ค.
Tomcat ์ค์ ๋ถํฐ JDBC, DB ์ ํ ์ ๋ถ..
ํ์ง๋ง ์ด ๊ณผ์ ์ด ์์๊ธฐ์ ํ์ฌ Spring ๊ธฐ๋ฐ ํ๋ก์ ํธ ๊ฐ๋ฐ ์ ์ด๋ค ๋ถ๋ถ์ด ์๋ํ๋๋ฉฐ DB ์์ ์ JDBC Template, JPA์ ํธ๋ฆฌํจ์ ๋๋ ์ ์๋ค ์๊ฐํ๋ค.
๋ํ ๋ด๋ถ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ด ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ์์์ผํ๊ธฐ ๋๋ฌธ์ ๋จผ์ ์์ ์๋ฐ ์ฝ๋๋ก ํ๋ก์ ํธ๋ฅผ ์์ํ๊ณ ๊ทธ ๋ค์ ๊ฐ์ ์ํค๋ฉฐ Developํ๋ ๊ฒ์ด ํ์ต์๋ ๋ ์ข๋ค๊ณ ์๊ฐํ๋ค. ( ๋ด ๊ฐ์ธ์ ์๊ฒฌ ๐ )
JDBC Template
โข JDBC์ ๋์ผํ ํ๊ฒฝ์ค์
โข DriveManager๊ฐํ๋์ผ๋ค์ JdbcTemplate์๊ฒ ๋งก๊น๋๋ค.
โข JDBC๋ก ์ฒ๋ฆฌํ๋ ์๋น ๋ถ๋ถ์ ์ฝ๋์ ํ๋ผ๋ฏธํฐ ์ค์ ๋ฐ ๊ฒฐ๊ณผ ๋งคํ์ ๋์ ํด์ค๋๋ค.
โข JdbcTemplate, MyBatis๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ SQL Mapper ์ค ํ๋
โข SQL Mapper
- SQL ๋ฌธ์ฅ์ผ๋ก ์ง์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฌ๋ค.
- SQL โ ๋งคํ โ Object ํ๋
- ์ฆ, SQL Mapper๋ SQL์ ๋ช ์ํด ์ค์ผํ๋ค.
- ex) MyBatis, Jdbc Templates

@Override
public Member save(Member member) {
// sql์ ์ง์ ์ง์ง ์๋ ๋ฐฉ๋ฒ
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName());
Number key = jdbcInsert.executeAndReturnKey(new
MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
}
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
return result.stream().findAny();
}
์๊น JDBC API์ ๋ณธ ๋ฐ๋ณต ์ฝ๋ ๋ฐ ์ค๋ณต๋ ๋ถ๋ถ์ด ๋๋ถ๋ถ ์ ๊ฑฐ๋์์ง๋ง SQL์ ์ง์ ์์ฑํด์ค์ผ ํฉ๋๋ค.
JDBC Template๋ฅผ ์ฌ์ฉํ๋๋ก ์ถ๊ฐ๋ก DataSource ์ ๋ณด๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
- DataSource๋ฅผ ์ง์ Bean์ผ๋ก ๋ฑ๋ก
- application.yml์ ์ค์
DataSource
- DB Server์ ์ฐ๊ฒฐ ์ํค๋ Connection์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ Bean์ผ๋ก ๋ฑ๋กํ์ฌ ์ธ์๋ฅผ ๋๊น
- DB Connection Pooling ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์
JPA ( Java Persistence API )
โข ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ์ํ๋ ์ธํฐํ์ด์ค
โข ์ธํฐํ์ด์ค๋ผ๋ ์ ์์ ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ ์ด ์๋ ํน์ ํ ๊ธฐ์ ์ ๋ช ์ธํ ๊ฒ์ ๊ฐ๊น์
โข ํน์ ํ ๊ธฐ์ : ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์
โข ๋ํ์ ์ธ ORM( Object Relational Mapping ) ex) hibernate
โข ORM
- ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฌ๋ค.
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํ(์ฐ๊ฒฐ)ํด ์ฃผ๋ ๊ฒ์ ๋งํ๋ค.
- SQL ์ฟผ๋ฆฌ๊ฐ ์๋ ๋ฉ์๋๋ก ๋ฐ์ดํฐ ์กฐ์ ๊ฐ๋ฅ
- ๊ฐ์ฒด๊ฐ ๊ด๊ณ๋ฅผ ๋ฐํ์ผ๋ก SQL์ ์๋์ผ๋ก ์์ฑ
- DB Data โ ๋งคํ โ Object ํ๋
- Persistence API ๋ผ๊ณ ๋ ํ ์ ์๋ค.
- ex) Hibernate, EclipseLink, DataNucleus ..
build.gradle ์ค์
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
Hibernate Framework๋ฅผ ํ์ฉ
Spring Boot JPA ์ค์ ์ถ๊ฐ
resources/application.properties
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
/*
show-sql : JPA๊ฐ ์์ฑํ๋ SQL ์ถ๋ ฅ
ddl-auto : JPA๋ ํ
์ด๋ธ์ ์๋์ผ๋ก ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ none์ ์ฌ์ฉํ๋ฉด ํด๋น ๊ธฐ๋ฅ์ ๋๋ค.
*/

JPA๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ JPA๋ฅผ ํ์ฉํ์ ๋ JDBC API๋ฅผ ํตํด SQL์ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ์ถํ๋ ์ ๊ฐ๋ก ์ด๋ฃจ์ด์ง.
์ฆ, ๊ฐ๋ฐ์๋ JPA์ ํ์ฉ๋ฒ๋ง ์ตํ๋ฉด DB ์ฟผ๋ฆฌ ๊ตฌํ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
@Override
public Member save(Member member) {
em.persist(member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
์ด์ฒ๋ผ JPA๋ฅผ ์ด์ฉํ๋ฉด ๊ธฐ์กด์ ๋ฐ๋ณต์ฝ๋๊ฐ ์ค์ด๋ ๋ค๋ ๊ฒ์ ๋ณผ ์ ์๊ณ , SQL๋ JPA๊ฐ ์ง์ ๋ง๋ค์ด ์คํํด ์ค๋๋ค.
๋ํ SQL๊ณผ ๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์์ ๊ฐ์ฒด ์ค์ฌ์ ์ค๊ณ๋ก ํจ๋ฌ๋ค์์ ์ ํํ์ฌ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐ์ ๋ ์ง์คํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํด์ค๋๋ค. ๊ทธ๋ ๊ธฐ์ ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ์ค์ฌ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๊ณ ๊ฐ๋ฐ ์์ฐ์ฑ ๋ํ ์ฆ๊ฐํฉ๋๋ค.
โข ์ธํฐํ์ด์ค๋ฅผ ํตํ ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋ฅ
โข findByName(), findByEmail() ๊ณผ ๊ฐ์ด ๋ฉ์๋ ์ด๋ฆ๋ง์ผ๋ก Data ์กฐํ ๊ฐ๋ฅ
โข ํ์ด์ง ๊ธฐ๋ฅ
์ ๋ฆฌ

ํ์ต์ ๋ง์ ๋์์ด ๋ ๋ธ๋ก๊ทธ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ต๋๋ค. ๐
์ฐธ์กฐ ๋ฐ ์ถ์ฒ
JPA vs JDBC, JPA vs Mybatis, JPA vs Spring Data JPA์ ์ฐจ์ด์ ๊ณผ Hibernate
'๐Spring > Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Bean Life Cycle (0) | 2022.06.23 |
---|---|
Spring Singleton (0) | 2022.06.22 |
Spring Framework, Spring Boot (0) | 2022.06.18 |
Spring Bean, Spring Container (0) | 2022.06.17 |
MVC, Spring MVC (0) | 2022.06.16 |