(๋งฅ๋ถ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์์ต๋๋ค)
DB๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ํ๋ก์ ํธ๋ฅผ ์ด๊ณ ์ธํ
๋ฆฌ์ ์ด์ ์ค๋ฅธ์ชฝ์ ์๋ DB๋ฅผ ๋๋ฅด๊ณ Data Source ์์ ํ์ฌ ์์ ์ ์ปดํจํฐ์ ์ค์น๋์ด์๋ DB ์์คํ
์ ์ ํํฉ๋๋ค
์ ๋ MySQL์ ์ฌ์ฉํ์ต๋๋ค

๊ทธ๋ฆฌ๊ณ ๋ณธ์ธ์ด Sql ์ค์นํ ๋ ์ค์ ํ๋ User ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์ค์ ํฉ๋๋ค
(mySQL์ ์ ์ ์ด๋ฆ์ด ๊ธฐ๋ณธ์ผ๋ก root๋ก ์ค์ ๋๋ ๊ฒ ๊ฐ์์)
๋ค ์์ฑํ ํ ์์ฑํ๊ธฐ ์ ์, ๋จผ์ Test Connection์ ๋๋ฌ ์ ์ฐ๊ฒฐ๋๊ณ ์๋์ง ํ์ธํฉ์๋ค.
โ Succeeded๊ฐ ๋์๋ค๋ฉด ์ฑ๊ณต!

์ค๋ฅธ์ชฝ์ DataBase ์ฐฝ์ด ์๊ฒผ์ํ
๋ฐ, ์ฌ๊ธฐ์ ์์ชฝ์ + ๋ฒํผ์ ๋๋ฌ ์๋ก์ด ์คํค๋ง๋ฅผ ์์ฑํฉ๋๋ค

์๋์ sql๋ฌธ์ ๋ฃ์ด์ฃผ๊ณ Create๋ฌธ์ผ๋ก ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ค์๋ค (DDL)
use ํ
์ด๋ธ๋ช

์คํํ๋ฉด ์ค๋ฅธ์ชฝ์ ํ ์ด๋ธ์ด ์ ์์ฑ๋ ๋ชจ์ต์ ํ์ธํ ์ ์์ด์ฉ
๋ง์ฝ์ ๋ด๊ฐ ์ด ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ณ ์ถ๋ค?
๊ทธ๋ฌ๋ฉด tables์์ ์ค๋ฅธ์ชฝ ํด๋ฆญ!
Diagrams์์ Show Diagramsํ๋ฉด,

์๋์ฒ๋ผ ์๋์ผ๋ก ERD๋ฅผ ์์ฑํด์ฃผ๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค
(ํจ์ ์ธํ
๋ฆฌ์ ์ด๐)

์ดํ์๋ SQL ๋ฌธ๋ฒ๋๋ก, ๋ฐ์ดํฐ CRUD๊ฐ ๊ฐ๋ฅํฉ๋๋ค
์์๋ก,
-- students ํ
์ด๋ธ์ email ์ปฌ๋ผ ์ถ๊ฐ
ALTER TABLE student ADD COLUMN email VARCHAR(100) NOT NULL;
-- major ํ
์ด๋ธ์ name ์ปฌ๋ผ์ ๊ธธ์ด ๋ณ๊ฒฝ
ALTER TABLE major MODIFY COLUMN name VARCHAR(100);
-- major ํ
์ด๋ธ์ ํํฐ UNIQUE ์ ์ฝ์กฐ๊ฑด ์ค์
ALTER TABLE major ADD CONSTRAINT UNIQUE(tutor);
-- student ํ
์ด๋ธ์ ๋ฐ์ดํฐ ์ฝ์
INSERT INTO student (name, age, grade, email) VALUES('ํ์1', 20, 'AAA', 'a@a.com');
select * from student;
-- ํ์1 ๋์ด๋ฅผ 21๋ก ์
๋ฐ์ดํธ
UPDATE student SET age = 21 WHERE name = 'ํ์1';
-- ์๋ณ์ 4๋ฒ์ student ์ญ์
DELETE FROM student WHERE id = 4;
์ด์ฒ๋ผ ๋ฐ์ดํฐ CRUD๊ฐ ๊ฐ๋ฅํฉ๋๋ค!
:Java ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ DB์ ์ํธ ์์ฉํ๊ธฐ ์ํ ์๋ฐ ํ์ค ์ธํฐํ์ด์ค
โ DBMS์ ํต์ ํด ๋ฐ์ดํฐ๋ฅผ CRUDํ ์ ์๋ฐ!
๐ ํน์ง ๋ฐ ์ฅ์
1. ํ์ค API๋ฅผ ์ง์
: DB ๋ํด ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ํธ ์์ฉ
โ DB ์ข ๋ฅ๊ฐ ๋ฐ๋์ด๋ ์ฟผ๋ฆฌ๋ฌธ์ด ์คํ๋๋ค. MySQL โ ORACLE
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ : DB์ ์ธํ ๋ฆฌ์ ์ด ์ฐ๊ฒฐ ๊ฐ์ด๋
3. Prepared Statement
4. ๊ฒฐ๊ณผ ์งํฉ ์ฒ๋ฆฌ(Result Set)
โ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ Java ๊ฐ์ฒด๋ก ๋งคํํ ์ ์๋ค.
5. ํธ๋์ญ์ ์์ ๊ฐ๋ฅ
: SQL๋ฌธ์ ์ปดํ์ผ ๋จ๊ณ์์ ?๋ฅผ ์ฌ์ฉํ๋ฏ๋ก์ preComile(๋ฏธ๋ฆฌ ์ปดํ์ผ ํด๋๊ธฐ)๋ก ์ฟผ๋ฆฌ๋ฌธ์ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ํ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
โ ์ฟผ๋ฆฌ๊ฐ ํ ๋ฒ ์ปดํ์ผ๋๋ฉด ์ฌ๋ฌ๋ฒ ์คํํ ์ ์์ด์ ์ฑ๋ฅ ํฅ์๊ณผ ๋ณด์ ๊ฐํํด์ค๋ค
MySQL๊ณผ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ ์๋์ฒ๋ผ
application.properties ํ์ผ์ JDBC์ค์ ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค
spring.datasource.url=jdbc:mysql://localhost:3306/์ถ๊ฐํ DB์ด๋ฆ
spring.datasource.username=๊ณ์
spring.datasource.password=๋น๋ฐ๋ฒํธ
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
: JDBC์ ๋ฐ๋ณต์ ์์ ๋ค์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๋ ํด๋์ค (์ฐ๊ฒฐ, SQL์คํ, ์์ ํด์ ๋ฑ)
PreparedStatement๋ฅผ ์ฌ์ฉ, SQL ์ธ์ ์
์ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ ๊ฐ์ ์์์ ์ด๋ฏธ prepared statement๋ ์ค์ ํด์ฃผ์์ผ๋ฏ๋ก
bulid.gradle์ ์์กด์ฑ์ ์ถ๊ฐํด์ฃผ์
์๋์ ์ฝ๋๋ฅผ Dependency์ ์ถ๊ฐํ๋ฉด ๋๋ค
// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
// JDBC Template
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
(1) JdbcTemplate๊ฐ DataSource๋ก๋ถํฐ ์ปค๋ฅ์
์ ๊ฐ์ ธ์จ๋ค
(2) SQL์ ์คํํ ๋ PreparedStatement๋ฅผ ์ฌ์ฉ (?๋ก ๊ฐ์ ๋ฐ์ธ๋ฉํ๊ธฐ ๋๋ฌธ์ SQL ์ธ์ ์
๋ฐฉ์ง ๊ฐ๋ฅ)
(3) ์์ธ ์ฒ๋ฆฌ๋ฅผ ์๋์ผ๋ก (SQLException โ DataAccessException)
(4) SQL ์คํ ํ ์์์ ์๋์ผ๋ก ํด์ (์ปค๋ฅ์
๋ฐํ ํฌํจ)
์ฌ๊ธฐ์ ์ ๊น, Spring Bean์ ๋ํด ์ง๊ณ ๋์ด๊ฐ์
: ์๋ฐ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ new ํค์๋๋ก ๋ง๋ค์์๋ค.
ํ์ง๋ง spring์ ์ด๋ฅผ ๋์ ํด์ค๋ค ใ
.ใ
Spring ์ปจํ
์ด๋๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ํ์ํ ๋ ์๋์ผ๋ก ์ฃผ์
ํด์ค๋ค => Spring Bean
โ ์ฃผ๋ก service repository controller ์์ ์ฌ์ฉ๋๋ค
@Component
public class MyComponent {
public void sayHello() {
System.out.println("Hello, Spring Bean!");
}
}
@Service
public class MyService {
public String getMessage() {
return "Hello from MyService!";
}
}
์ฌ์ค.. ์ด์ ๋ฉ๋ชจ์ฅ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ค,..
(ํ๊ธฐ๋ ํ์ง๋ง ๋์ ์ ๋๋ก ๋ค์ด๊ฐ์ง ๋ชปํ ๋๋ใ
ใ
)
์ด์ด์ด๊ฐ๋จํ ๋ฉ๋ชจ์ฅ ์์ ๋ฅผ ๋ง๋ค๋ฉด์ ๋จธ๋ฆฌ์์ ์ง์ด๋ฃ์ด๋ณด์
๋จผ์ ๋ฉ๋ชจ๋ฅผ ํฌ์คํธํ๊ณ ์ ์ฒด ๋ชฉ๋ก์ ์กฐํํ๋ ๋ฉ๋ชจ์ฅ์ ๋ง๋ค์ด๋ณด์!
1. ์์กด์ฑ ์ถ๊ฐ
application.properties ํ์ผ์ ์๋ ์ฝ๋๋ฅผ ๋ฃ์ด์ sql๊ณผ ์ฐ๊ฒฐ
spring.datasource.url=jdbc:mysql://localhost:3306/DB๋ช
spring.datasource.username=์ฌ์ฉ์๋ช
spring.datasource.password=๋น๋ฒ
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2. gradle ์ถ๊ฐ
build.gradle ํ์ผ์ dependenctis์ ์๋ ์ฝ๋ ์ถ๊ฐํ๊ณ ์ค๋ฅธ์ชฝ ์์ ์๊ฒ ๋จ๋ ์ฝ๋ผ๋ฆฌ ๋ฒํผ ๋๋ฅด๊ธฐ
// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
// JDBC Template
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
3. db ๋ง๋ค๊ธฐ&์ถ๊ฐํ๊ธฐ(DDL)

๋ง์ง๋ง์ค์ select๋ฌธ์ผ๋ก ๋ฐ์ดํฐ ์ ์ฒด ์กฐํํด์ ์ ๋ค์ด๊ฐ๋์ง๊น์ง ํ์ธํ๊ธฐ
: ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ํด๋น ํด๋์ค์ ํ๋๋ก ์ ์
โ JSON ๋ฐ์ดํฐ๋ฅผ DTO ๊ฐ์ฒด๋ก ๋งคํํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅ!
@Getter
@AllArgsConstructor
public class MemoRequestDto {
private String title;
private String content;
}
์๋น์ค ํด๋์ค์๋ ๋ญ๊ฐ ์์ด์ผํ๋ค????
@Service ์ด๋
ธํ
์ด์
ํ์๋ก ๋ฌ์๋๊ณ ์์.
@Service //์ด๊ฑฐ ์๋น์ค ํด๋์ค๋ผ๊ณ ์คํ๋งํํ
์๋ ค์ฃผ๋๊ฑฐ์
@AllArgsConstructor //์์ฑ์ ์๋์ผ๋ก ๋ง๋ค์ด์ค
private final JdbcTemplate jdbcTemplate;
JDBC๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ ์ ์๋ ๋ณต์กํ ์์
๋ค์ ๋จ์ํํ๊ณ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ JdbcTemplate ๋จผ์ ์ ์ํด์ฃผ์
๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฅผ ์ ์ฅ(Post)ํด์ผํ๋๊น saveMemo๋ฉ์๋ ๋ง๋ค์
//๋ฉ๋ชจ ์ ์ฅ
public void saveMemo(String title, String content){
String sql = "Insert Into memoJ (title, content Values (?, ?)";
jdbcTemplate.update(sql, title, content);
}
INSERT INTO memoJ (title, content) VALUES (?, ?)
?์ ์ค์ ๊ฐ์ด ๋ค์ด๊ฐ ์๋ฆฌ ํ์์!
=> ์ปดํ์ผ๋์ด ๋ฏธ๋ฆฌ ์ค๋น๋ ์ํ๋ก ๋ณด๊ด๋จ
jdbcTemplate.update(sql, title, content);
title๊ณผ content๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ ๋ฌ๋๋ ๊ฐ
์ด ๊ฐ๋ค์ด ์์๋๋ก ? ๋ถ๋ถ์ ๋ค์ด๊ฐ๋ค
๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉํ getMemos()
//๋ฉ๋ชจ ์กฐํ
public List<Map<String, Object>> getMemos(){
String sql = "SELECT * FROM memos";
return jdbcTemplate.queryForList(sql);
}
@RestController
@RequestMapping("/memos") //prefix ์ค์
@AllArgsConstructor // Lombok ์ด๋
ธํ
์ด์
, ๋ชจ๋ ํ๋๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์์ฑ์ ์๋ ์์ฑ
public class MemoController {
private final MemoService memoService;
๋จผ์ ์๊น ๋ง๋ MemoService๋ฅผ ๊ฐ์ ธ์ค์
-> ์ด๋
ธํ
์ด์
์ ํตํด ์์ฑ์ ์๋ง๋ค์ด๋ ๋จ! ๊ฐ๊ฟ ใ
๊ทธ๋ฆฌ๊ณ DTO๋ฅผ ์ฌ์ฉํด๋ณด์
@PostMapping
public String saveMemo(@RequestBody MemoRequestDto dto){
memoService.saveMemo(dto.getTitle(), dto.getContent());
return "Saved";
}
@GetMapping
public List<Map<String, Object>> getMemos(){
return memoService.getMemos();
}
saveMemo ๋ฉ์๋๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ json ํํ๋ก ์ ์ฅํ๊ธฐ ์ํด์ ์๊น dto๋ฅผ ๋ง๋ค์์๋์?
๊ทธ๊ฑธ ํ์ฉํ๋๊ฑฐ์ฅ
@RequestBody MemoRequestDto dto
@RequestBody๋ฅผ ์ฌ์ฉํด์ MemoRequestDto๋ฅผ ๋งคํ๋ฐ์ ์ ์๋น
์!! ํฌ์คํธ๋งจ์ผ๋ก ์คํํด๋ณด์
POST ๋ก ๋ฐ์ดํฐ ๋ฃ๊ธฐ

PUT ์ผ๋ก ๋ฉ๋ชจ ์ ์ฒด ์กฐํํ๊ธฐ

์ฑ๊ณต!!!!!
๋๋์ด ์กฐ๊ธ ์ดํดํ ๊ฒ ๊ฐ๋ค ๐ฅน
์๋ฌ๊ฐ ์๊ฐ๋ณด๋ค ์ข ์ข ๋ฐ์ํ์๋๋ฐ, ๊ทธ ์ด์ ์ 80%๊ฐ ๊ฑฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฆ์ ์๋ชป ์ ๋ ฅํด์์๋คใ ใ
Serviceํด๋์ค์์ DB๋ฅผ ๋งตํํ๋๋ฐ

์ฌ๊ธฐ์ DB์ด๋ฆ ์ ๋ ฅ์ ์ค๋ฅ๊ฐ ์์๋คใ ใ ํญ์ ์ฃผ์ํ ๊ฒ!!!