๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ ์๋น์ค ๊ณ์ธต์์ ๋น์ฆ๋์ค ๋ก์ง์ ํตํด ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฑ์ ์ญํ ์ ์ํํ๋ค.
๐กJDBC(Java Database Connectivity)๋?
Java ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋ ๋ ๋ฒจ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ ๋ฐ ์ ๋ฐ์ดํธ ํ๊ฑฐ๋ ๋ฐ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ Java ์ฝ๋ ๋ ๋ฒจ์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ Java์์ ์ ๊ณตํ๋ ํ์ค ์ฌ์.
Java ํ๋ก๊ทธ๋จ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ ์ ์๋๋ก ํ๋ ํ์ค Java API.
Spring์์๋ JDBC API๋ฅผ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ Spring Data JDBC๋ Spring Data JPA๊ฐ์ ๊ธฐ์ ์ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ค์ด ์กฐ๊ธ ๋ ํธ๋ฆฌํ๊ฒ ๋ฐ์ดํฐ ์ก์ธ์ค ๋ก์ง์ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋ค. (Spring Data JDBC๋ Spring Data JPA ๊ฐ์ ๊ธฐ์ ์ญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก JDBC๋ฅผ ์ด์ฉํจ.)
๐กJDBC ๋์ ํ๋ฆ
JDBC๋ Java ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ JDBC API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํ๋ ๋จ์ํ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ JDBC์ ๋์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ด ๋งค์ฐ ์ฌํํ๋ค.
Java ์ ํ๋ฆฌ์ผ์ด์ ์์ JDBC API๋ฅผ ์ด์ฉํด ์ ์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ฉํ ํ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธํฐ๋์ ํ๋ค.
์ด์ฒ๋ผ, JDBC API๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์ฒด์ ์ธ ์ธํฐ๋ ์ ์ ํ๊ธฐ ์ํด์๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋จผ์ ๋ก๋ฉํ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํด์ผ ํ๋ค.
๐กJDBC ๋๋ผ์ด๋ฒ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ์ ๋ด๋นํ๋ ์ธํฐํ์ด์ค. Oracle, MySQL, My SQL ๊ฐ์ ๋ค์ํ ๋ฒค๋์์๋ ํด๋น ๋ฒค๋์ ๋ง๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๊ตฌํํด์ ์ ๊ณตํ๊ฒ ๋๊ณ , ์ด JDBC ๋๋ผ์ด๋ฒ์ ๊ตฌํ์ฒด๋ฅผ ์ด์ฉํด์ ํน์ ๋ฒค๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ก์ธ์คํ ์ ์์.
JDBC API ์ฌ์ฉ ํ๋ฆ
1) JDBC ๋๋ผ์ด๋ฒ ๋ก๋ฉ : JDBC ๋๋ผ์ด๋ฒ๋ DriveManager๋ผ๋ ํด๋์ค๋ฅผ ํตํด ๋ก๋ฉ๋จ.
2) Connection ๊ฐ์ฒด ์์ฑ : DriverManager๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋๋ ์ธ์ (Session)์ธ Connection ๊ฐ์ฒด๋ฅผ ์์ฑํจ.
3) Statement ๊ฐ์ฒด ์์ฑ : Statement ๊ฐ์ฒด๋ ์์ฑ๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๊ธฐ ์ํ ๊ฐ์ฒด ์์ฑ ํ์ ์ ์ ์ธ SQL ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ์ ๋ ฅ์ผ๋ก ๊ฐ์ง.
4) Query ์์ฑ : ์์ฑ๋ Statement ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ์ ๋ ฅํ SQL ์ฟผ๋ฆฌ๋ฅผ ์คํํจ.
5) ResultSet ๊ฐ์ฒด๋ก๋ถํฐ ๋ฐ์ดํฐ ์กฐํ : ์คํ๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๋ํ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ์ .
6) ResultSet ๊ฐ์ฒด Close : JDBC API๋ฅผ ํตํด ์ฌ์ฉ๋ ๊ฐ์ฒด๋ค์ ์ฌ์ฉ ์ดํ์ ์ฌ์ฉํ ์์์ ์ญ์์ผ๋ก ์ฐจ๋ก๋ก Close๋ฅผ ํด์ฃผ์ด์ผ ํจ.
7) Statement ๊ฐ์ฒด Close
8) Connection ๊ฐ์ฒด Close
Connection Pool์ด๋?
JDBC API๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ์ํ Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์ ๋น์ฉ์ด ๋ง์ ๋๋ ์์ ์ค ํ๋.
๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ Connection ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ์ด ํ์ํ ๊ฒฝ์ฐ, Connection ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋ Connection ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์ํ ์ ์๋ค.
์ด์ฒ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค Connection์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ๋ณด๊ดํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ํ ๋ ์ด Connection์ ์ ๊ณตํด์ฃผ๋ ์ญํ ์ ํ๋ Connection ๊ด๋ฆฌ์๋ฅผ ๋ฐ๋ก Connection Pool์ด๋ผ๊ณ ํ๋ค.
Spring Boot 2.0 ์ด์ ์๋ Apache ์ฌ๋จ์ ์คํ ์์ค์ธ Apache Commons DBCP(Database Connection Pool)๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ์ผ๋ Spring Boot 2.0๋ถํฐ๋ ์ฑ๋ฅ๋ฉด์์ ๋ ๋์ ์ด์ ์ ๊ฐ์ง๊ณ ์๋ HikariCP๋ฅผ ๊ธฐ๋ณธ DBCP๋ก ์ฑํํจ.
๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ ํ์ผ๋ก, Spring์์ ์ฌ์ฉํ ์ ์๋ ๋ํ์ ์ธ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์๋ mybatis, Spring JDBC, Spring Data JDBC, JPA, Spring Data JPA ๋ฑ์ด ์๋ค.
SQL ์ค์ฌ ๊ธฐ์ ๋ก๋ iBatis, mybatis, Spring JDBC๊ฐ ์๋ค. SQL ์ค์ฌ ๊ธฐ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํด SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์ง์ ์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ค์ฌ์ด ๋๋ ๊ธฐ์ ์ด๋ค.
๋ค์์ mybatis์์ ์ฌ์ฉ๋๋ SQL Mapper์ ์์ด๋ค.
<select id="findMember" resultType="Member">
SELECT * FROM MEMBER WHERE member_id = #{memberId}
</select>
mybatis์ ๊ฒฝ์ฐ, SQL Mapper๋ผ๋ ์ค์ ํ์ผ์ด ์กด์ฌํ๋๋ฐ, ์ด SQL Mapper์์ SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ ์ ์ผ๋ก ์์ฑํ๋ค.
์์ฑ๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํน์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ํ, Java ๊ฐ์ฒด๋ก ๋ณํํด์ฃผ๋ ๊ฒ์ด mybatis์ ๋ํ์ ์ธ ๊ธฐ์ ์ ํน์ง์ด๋ค.
์ฝ๋์์ ๋ณด๋ค์ํผ SQL ๋ฌธ์ด ์ง์ ์ ์ผ๋ก ํฌํจ๋์ด ์๋ค.
๋ค์์ Spring JDBC์ JdbcTemplate์ด๋ผ๋ ํ ํ๋ฆฟ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ ์์ด๋ค.
Member member = this.jdbcTemplate.queryForObject(
"select * from member where member_id=?", 1, Member.class);
Spring JDBC์ ๊ฒฝ์ฐ, Java ์ฝ๋์ SQL ์ฟผ๋ฆฌ๋ฌธ์ด ์ง์ ์ ์ผ๋ก ํฌํจ๋์ด ์๋ค.
์ด์ฒ๋ผ, SQL ์ฟผ๋ฆฌ๋ฌธ์ด ์ง์ ์ ์ผ๋ก ํํจ๋๋ ๋ฐฉ์์ ๊ณผ๊ฑฐ๋ถํฐ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก, ํ์ฌ๋ ์ฌ์ฉ์ด ๋๊ณ ์์ผ๋ Java ์ง์์์๋ SQL ์ค์ฌ์ ๊ธฐ์ ์์ ๊ฐ์ฒด(Object) ์ค์ฌ์ ๊ธฐ์ ๋ก ์ง์์ ์ผ๋ก ์ด์ ์ ํ๊ณ ์๋ ์ถ์ธ์ด๋ค.
๊ฐ์ฒด(Object) ์ค์ฌ ๊ธฐ์ ์ Spring Data JDBC, JPA, Spring Data JPA๊ฐ ์๋ค.
๊ฐ์ฒด ์ค์ฌ ๊ธฐ์ ์ SQL ์ฟผ๋ฆฌ๋ฌธ ์์ฃผ๋ก ์๊ฐํ๋ ๊ฒ์ด ์๋๋ผ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด ๊ด์ ์ผ๋ก ๋ฐ๋ผ๋ณด๋ ๊ธฐ์ ์ด๋ค.
์ฆ, ๊ฐ์ฒด ์ค์ฌ ๊ธฐ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํด์ SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ ์ ์ผ๋ก ์์ฑํ๊ธฐ๋ณด๋ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ ๊ฒฝ์ฐ, Java ๊ฐ์ฒด(Object)๋ฅผ ์ด์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ์์ ์ด Java ๊ฐ์ฒด๋ฅผ SQL ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์๋ ๋ณํํ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ์ ๊ทผํ๋ค.
์ด๋ฌํ ๊ฐ์ฒด(Object) ์ค์ฌ์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ ์ ORM(Object-Relational Mapping)์ด๋ผ๊ณ ํ๋ค.
Java์์ ๋ํ์ ์ธ ORM ๊ธฐ์ ์ด JPA(Java Persistence API).
JPA๋ฅผ ์ฌ์ฉํ๋ฉด SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ ์ ์ผ๋ก ๋ค๋ฃฐ ์ผ์ ๋ง์ง ์๋ค.
๋ฌผ๋ก , ๋ณต์กํ ์กฐ๊ฑด์ ๋ฐ์ดํฐ ์กฐํ๋ฅผ ์ํด SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง, ๊ทธ ์ฌ์ฉ ๋น๋์๊ฐ ์ด ์ ๋ณด๋ค ๊ธ๊ฒฉํ ์ค์๋ค.
Spring Data JDBC๋?
Spring Data JDBC๋ JPA์ฒ๋ผ ORM ๊ธฐ์ ์ ์ฌ์ฉํ์ง๋ง, JPA์ ๊ธฐ์ ์ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ์ฝ๋ค.
Spring Data JDBC ์ Spring Data JPA
์ฐ์ , Spring Data JDBC ๊ธฐ์ ์ 2018๋ ์ 1.0๋ฒ์ ์ด ์ฒ์ ๋ฆด๋ฆฌ์ฆ๋์๊ธฐ ๋๋ฌธ์ ๊ธฐ์ ์ ์ญ์ฌ๊ฐ ์์ง ์งง์ ํธ.
๋ฐ๋ผ์ ํ์ฌ๋ ๊ธฐ๋ฅ ์ ๊ทธ๋ ์ด๋๊ฐ ๊พธ์คํ ์ด๋ฃจ์ด์ง๊ณ ์์ง๋ง, ์์ง๊น์ง๋ JPA๋ณด๋ค ์๋์ ์ผ๋ก ์ ๊ฒ ์ฌ์ฉ๋๋ค.
ํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ท๋ชจ๊ฐ ์๋์ ์ผ๋ก ํฌ์ง ์๊ณ , ๋ณต์กํ์ง ์์ ๊ฒฝ์ฐ์๋ Spring Data JDBC๊ฐ ๋ฐ์ด๋ ์์ฐ์ฑ์ ๋ณด์ฌ์ค๋ค.
๊ทธ๋ฆฌ๊ณ Spring Data JDBC๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ ORM ๊ฐ๋ ๊ณผ Spring์์ Data์ ์ ๊ทผํ๋ ์ผ๊ด๋ ์ ๊ทผ ๋ฐฉ์์ ๋จผ์ ์ ํ๊ฒ ๋๋ฏ๋ก, JPA์ Spring Data JPA๋ฅผ ์ดํดํ๋๋ฐ ๊ฝค ๋ง์ ๋์์ด ๋๋ค.
JPA๋ ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์, ๋น์ฐํ ์์์ผ ํ๋ค.
Spring Data JPA๋ Spring์์ JPA๊ธฐ์ ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์ JPA์ ๋ํ ์ ํ ์ง์์ด ์์ด์ผ ์ ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Spring Data JDBC๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ Spring Boot Starter๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
dependencies {
...
...
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
runtimeOnly 'com.h2database:h2'
}
Hello World ์ํ ์ฝ๋ ๊ตฌํ
ํด๋ผ์ด์ธํธ ์ชฝ์์ "Hello, World" ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ Request Body๋ก ์ ์กํ ํ์ Spring Data JDBC๋ฅผ ์ด์ฉํด์ "Hello, World" ๋ฌธ์์ด์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํด ๋ณด๋๋ก ํ์.
์๋น์ค ๊ณ์ธต์ MessageService ํด๋์ค์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ MessageRepository ์ธํฐํ์ด์ค๋ฅผ ์ด๋ป๊ฒ ์ฐ๋ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋์ง ์ดํดํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ Request Body๋ฅผ ์ ๋ฌํ๋ 'Hello, World' ๋ฌธ์์ด์ ๋ฐ์ธ๋ฉํ๋ DTO ํด๋์ค
@Getter
public class MessagePostDto {
@NotBlank
private String message;
}
Response์ ์ฌ์ฉํ DTO ํด๋์ค
package com.codestates.hello_world;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class MessageResponseDto {
private long messageId;
private String message;
}
Controller ํด๋์ค
package com.codestates.hello_world;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RequestMapping("/v1/messages")
@RestController
public class MessageController {
private final MessageService messageService;
private final MessageMapper mapper;
public MessageController(MessageService messageService, MessageMapper mapper) {
this.messageService = messageService;
this.mapper = mapper;
}
@PostMapping
public ResponseEntity postMessage(@Valid @RequestBody MessagePostDto messagePostDto){
Message message = messageService.createMessage(mapper.messageDtoToMessage(messagePostDto));
return ResponseEntity.ok(mapper.messageToMessageResponseDto(message));
}
}
DTOํด๋์ค์ ์ํฐํฐ ํด๋์ค๋ฅผ ๋งคํํด์ฃผ๋ Mapper ์ธํฐํ์ด์ค
package com.codestates.hello_world;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface MessageMapper {
Message messageDtoToMessage(MessagePostDto messagePostDto);
MessageResponseDto messageToMessageResponseDto(Message message);
}
๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๋์ ๋ด๋นํ๋ Repository์ธ MessageRepository ์ธํฐํ์ด์ค
package com.codestates.hello_world;
import org.springframework.data.repository.CrudRepository;
public interface MessageRepository extends CrudRepository<Message,Long> {
}
MessageService
package com.codestates.hello_world;
import org.springframework.stereotype.Service;
@Service
public class MessageService {
//(1)
private final MessageRepository messageRepository;
public MessageService(MessageRepository messageRepository) {
this.messageRepository = messageRepository;
}
//(2)
public Message createMessage(Message message){
return messageRepository.save(message);
}
}
Message ์ํฐํฐ ํด๋์ค
package com.codestates.hello_world;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
@Getter
@Setter
public class Message { //(1)
@Id //(2)
private long messageId;
private String message;
}
H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ MESSAGE ํ ์ด๋ธ ์์ฑ
spring:
h2:
console:
enabled: true
path: /h2
datasource:
url: jdbc:h2:mem:test
sql:
init:
schema-locations: classpath*:db/h2/schema.sql // (1) ํ
์ด๋ธ ์์ฑ ํ์ผ ๊ฒฝ๋ก
src/main/resources/db/h2/schema.sql
CREATE TABLE IF NOT EXISTS MESSAGE (
message_id bigint NOT NULL AUTO_INCREMENT,
message varchar(100) NOT NULL,
PRIMARY KEY (message_id)
);
Spring Data JDBC ์ ์ฉ ์์
1. build.gradle์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ค.
2. application.yml ํ์ผ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ค์ ์ ํ๋ค.
3. schema.sql ํ์ผ์ ํ์ํ ํ ์ด๋ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ํ๋ค.
4. application.yml ํ์ผ์์ schema.sql ํ์ผ์ ์ฝ์ด๋ค์ฌ ํ ์ด๋ธ์ ์์ฑํ ์ ์๋๋ก ์ด๊ธฐํ ์ค์ ์ ์ถ๊ฐํ๋ค.
5. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ๊ณผ ๋งคํํ ์ํฐํฐ ํด๋์ค๋ฅผ ์์ฑํ๋ค.
6. ์์ฑํ ์ํฐํฐ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ์ ์ฒ๋ฆฌํ Repository ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ค.
7. ์์ฑ๋ Repository ์ธํฐํ์ด์ค๋ฅผ ์๋น์ค ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋๋ก DI ํ๋ค.
8. DI๋ Repository ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์๋น์ค ํด๋์ค์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ CRUD ์์ ์ ์ํํ๋ค.
'Spring๐ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Security - JWT ์ธ์ฆ(Authentication) (0) | 2023.05.17 |
---|---|
Spring MVC - JUnit์ ์ฌ์ฉํ ๋จ์ ํ ์คํธ (0) | 2023.04.30 |
Spring MVC - ์์ธ ์ฒ๋ฆฌ(1) (0) | 2023.04.17 |
Spring Core - DI (0) | 2023.04.10 |
Spring Framework ๊ธฐ๋ณธ, ํน์ง, ์ฌ์ฉํ๋ ์ด์ (0) | 2023.04.02 |