์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |
- ์ด๋ ธํ ์ด์
- Kotlin
- FACTORY
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
- AndroidStudio
- Android Studio
- 2024-08-20
- Factory Method Pattern
- OpenAPI
- Python
- URN
- Dialog
- http method
- OOP
- ์ฑ์ฉํ์ ํ
- udp
- ๊ธฐ์ด100์
- menutab
- swagger
- uri
- tcp
- IOC
- ํ๋ IT&E
- ์ฝ๋์
- fontstyle
- di
- datepicker
- url
- reflection
- 2024-08-21
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 |