Bibi's DevLog ๐ค๐
[Spring, H2 database] ์คํ๋ง ์ฑ๊ณผ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐํ๊ธฐ ๋ณธ๋ฌธ
[Spring, H2 database] ์คํ๋ง ์ฑ๊ณผ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐํ๊ธฐ
๋น๋น bibi 2021. 3. 15. 23:35์ฌ์ค์ ๋ด๊ฐ ๋ณด๋ ค๊ณ ์ ๋ฆฌํ ๊ฒ์ด์ง๋ง... ๊ทธ๋์ ์ธ๊ฐ, ์์ , ๋ฏธ์ ํ๋ฉฐ ๋ฐฐ์ด ๊ฑธ ์์๋๋ก ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๋ฆฌํด ๋ณด์๋ค.
(H2๋ฐ์ดํฐ๋ฒ ์ด์ค, ์คํ๋ง ๋ถํธ, gradle, JPA ์ฌ์ฉ)
0. H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์น
H2๋ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ, ๊ต์ก ์ฉ๋์ DB์ด๋ค. ํํ์ด์ง
- ๊ฐ๋ณ๊ณ (์ฉ๋์ด ์๋ค) ํธ๋ฆฌํ๋ค
- ์น ํ๋ฉด์ ์ ๊ณตํด ์ค๋ค.
์ ํํ์ด์ง์์ ๋ค์ด๋ก๋ ๋ฐ ์ค์น ํ h2.sh
ํ์ผ์ ์คํํ๋ค.
(๊ธฐ๋ณธ์ ์ผ๋ก๋ ํ(~
)์ ์ค์น๋๋ค)
H2
-bin
-h2.sh
์คํ- git bash๋ฅผ ์ด์ฉํ๋ฉด ํธํ๋ค.
cd ~/H2
-cd bin
-./h2.bat
- ์๋์ฐ๋
h2.bat
(๊น๋ฐฐ์์์๋./h2.bat
) ์คํ - ๋งฅ์
./h2.sh
์คํ - ์ฐธ๊ณ : ์ข
๋ฃ๋
Ctrl + c
๋ก ์ข ๋ฃ.
- git bash๋ฅผ ์ด์ฉํ๋ฉด ํธํ๋ค.
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ '์น ์ฝ์' ์ฐฝ์ด ๋์จ๋ค.
์ฒ์์๋ ''๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ(.db
)''์ ๋ง๋ค์ด์ผ ํ๋ค.
- JDBC URL : ํ์ผ๋ก๋ถํฐ์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋งํ๋ค.
~/test
ํ์์ testํ์ผ์ ๋งํจ.test
๋ถ๋ถ์ ์์ ์ ํ๋ก์ ํธ๋ช ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค
- ์ด๋ฆฐ ์ํ ๊ทธ๋๋ก [์ฐ๊ฒฐ]์ ๋๋ฅด๋ฉด ์ฐฝ์ด ๋ฐ๋๋ค.
ํ์์ test.mv
๋ผ๋ ์ด๋ฆ์ .db
ํ์ผ(๋ฐ์ดํฐ๋ฒ ์ด์คํ์ผ)์ด ์๊ฒผ๋์ง ํ์ธํ๋ค.(cd
, ls
๋๋ ํ์๊ธฐ๋ก ์ง์ ํ์ธ)
JDBC URL์ฒ๋ผ ํ์ผ(
test
)๋ก ์ ๊ทผํ๊ฒ ๋๋ฉด, ์น ์ฝ์๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ ์ถฉ๋์ด ์ผ์ด๋ ์ ์์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฐ๊ฒฐ์ ๋๊ณ , ๋ค์ ์ ์ํ๊ธฐ ์ ์
JDBC URL ํญ๋ชฉ์
jdbc:h2:tcp://localhost/~/test
๋ก ๋ฐ๊พผ ๋ค ๋ค์ [์ฐ๊ฒฐ]ํ๋ค.์ด๋ ๊ฒ ์ ์ํ๋ฉด ํ์ผ์ ์ง์ ์ ๊ทผํ๋ ๊ฒ ์๋, ์์ผ์ ํตํด ์ ๊ทผํ๊ฒ ๋์ด ์ฌ๋ฌ ๊ณณ์์ ์ ๊ทผ ๊ฐ๋ฅํด์ง๋ค.
๋ง์ฝ ์ ์ ๋๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด,
rm test.mv.db
๋กtest.mv.db
ํ์ผ์ ์์ ํ ์ญ์ ํ, ์๋ฒ๋ฅผ ๊ป๋ค ์ผ ๋ค์ ์ฒ์๋ถํฐ ๋ค์ ์๋ํด ๋ณธ๋ค.
1. build.gradle, application.properties
build.gradle
์ dependencies
์ ์๋ ์์กด์ฑ์ ์ถ๊ฐ
runtimeOnly 'com.h2database:h2'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
(โ ์์ ํ gradle์ ์ ๋ฐ์ดํธํด์ผ ํ๋ค)
application.properties
์ ์๋ ์ค์ ์ ์ถ๊ฐ
spring.datasource.url=jdbc:h2:tcp://localhost/~/java-qna
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url
: H2์ฝ์์์ JDBC URL ์ ๋ฃ์๋ ๊ฒฝ๋ก์ ๊ฐ์์ผ ํ๋ค.spring.jpa.show-sql
,spring.jpa.properties.hibernate.format_sql
: JPA๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ ๋ฌ๋๋ ์ฟผ๋ฆฌ๋ฌธ์ ์ถ๋ ฅํ๊ฒ ํ๋ ์ต์ spring.jpa.hibernate.ddl-auto
: ํ ์ด๋ธ ์๋ ์์ฑ ์ค์ .create-drop
: ์๋ฒ ์์์ DB ํ ์ด๋ธ์ drop(์ญ์ )ํ ๋ค์ ์์ฑํจvalidate
: ์๋ฒ ์์์ DB ํ ์ด๋ธ์ dropํ์ง ์์
spring.h2.console ...
: H2 DB ์ฝ์์ ๋ํ ์ ๊ทผ ์ค์
2. DB์ ๋ฃ์ ํด๋์ค๋ฅผ DBํ ์ด๋ธ๊ณผ ๋งคํ
์๋ฐ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋งคํํ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ด ์๋์ผ๋ก ์์ฑ๋๋ค.
์ด๋ป๊ฒ? JPA๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํจ.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋๋ ํด๋์ค๋ค์ ๋ณดํต repository
๋๋ domain
์ด๋ผ๋ ํจํค์ง๋ฅผ ๋ง๋ค์ด ๊ด๋ฆฌํ๋ค.
DB์ ๋ฃ์ ํด๋์ค (์ฌ๊ธฐ์๋ User
)๋ฅผ DBํ
์ด๋ธ๊ณผ ๋งคํํ๋ค.
JPA๋ ORM ๊ธฐ์ ์ ์ฌ์ฉํ๋ค.
- ORM : Object Relational Mapping, ๊ฐ์ฒด - ๊ด๊ณํ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ๋งตํํ๋ ๊ธฐ์ .
๋งตํ์ ์ด๋ ธํ ์ด์ ์ ํตํด ์ด๋ฃจ์ด์ง๋ค.
import javax.persistence.*;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length=20)
private String userId;
private String password;
private String name;
private String email;
// getter and setter
}
๊ฐ ์ด๋ ธํ ์ด์ ์
Ctrl+ํด๋ฆญ
ํ๋ฉด ํด๋น ์ด๋ ธํ ์ด์ ์ ๊ธฐ๋ณธ๊ฐ(default)๋ฅผ ๋ณผ ์ ์์ผ๋ ์ฐธ๊ณ ํ๋ฉฐ ์์ ํ๋ฉด ์ข๋ค.
@Entity
: ํด๋น ํด๋์ค๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋๋ ํด๋์ค์์ ๋ช ์ํ๋ค. JPA๊ฐ ๊ด๋ฆฌํ๋ ์ํฐํฐ์ด์ DB์ ํ ์ด๋ธ๋ช ์ด ๋จ.@Id
: ํด๋น ์ธ์คํด์ค๋ณ์๋ฅผ PK(Primary Key)๋ก ์ค์ ํ๋ค.Primary Key
(PK) : ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ ๋ฐ์ดํฐ๋ค์ ์๋ณํ๊ธฐ ์ํ ๊ณ ์ ์๋ณ์๋ฅผ ์๋ฏธํจ.๋ณดํต์ PK๋ฅผ ์๋์ฆ๊ฐํ๋ ์ซ์๋ก ์ฌ์ฉํ๋ฉฐ
private long id;
๋ฅผ@Id
,@GeneratedValue
๋ก ์ค์ ํด ์ฌ์ฉํ๋ค.@GeneratedValue
: ์ฐ๋ฆฌ๊ฐ ์ง์ ++
ํ์ง ์์๋ DB๊ฐ ์๋์ผ๋ก ๊ฐ์ ์์ฑํด ๋ํด์ค๋ค.
@Column
: DB ํ ์ด๋ธ์ ์นผ๋ผ๊ณผ ๋งตํํ ์์๋ฅผ ์ ์ธnullable
: ์๋ต ๊ฐ๋ฅํ์ง์ ๋ํ ์์ฑ. ๊ธฐ๋ณธ์ ์ผ๋ก true์ด๋ค.length
: ์ต๋ ๊ธธ์ด์ ๋ํ ์์ฑ.
โ ๋ฐ๋์ ๋ชจ๋ ์ธ์คํด์ค๋ณ์์ ๋ํ getter, setter๋ฅผ ๊ตฌํํด ๋์ด์ผ ํ๋ค.
(๊ทธ๋์ผ ์คํ๋ง์ด ์๋์ผ๋ก ๊ฐ์ ๋ฃ๊ณ ๋บ ์ ์๋ค)
3. CRUD ๊ตฌํ - ์ธํฐํ์ด์ค ์ ์ธ
import com.codessquad.qna.User;
import org.springframework.data.repository.CrudRepository;
public interface UserReopsitory extends CrudRepository<User, Long> {
}
CrudRepository<?, ?>
: ์ด ์ธํฐํ์ด์ค๋ฅผ ์์ํ๋ฉด CRUD ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ง์๋ฐ์ ์ ์๋ค.<?, ?>
: ์ผ์ชฝ ?์๋ DB์ ๋ฃ๊ณ ๋นผ๋ ๊ฐ์ฒด (์ฌ๊ธฐ์๋User
)๋ฅผ, ์ค๋ฅธ์ชฝ ?์๋ Primary Key(์ฌ๊ธฐ์๋id
)์ ํ์ (Long
)์ ๋ฃ์ด ์ค๋ค.
- ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๋ฉด ์คํ๋ง์์ ์๋์ผ๋ก ๊ทธ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค๊ณ , ์คํ๋ง ๋น์ ๋ฑ๋กํด ์ค๋ค.
4. Controller์์ DB ์ฌ์ฉ
์ปจํธ๋กค๋ฌ์์, ์ ์ธํ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ํ๋ค.
CrudRepository
์์ ์ง์ํ๋ ๋ฉ์๋๋ค -save()
,findAll()
,findBy...()
.. ๋ฅผ ํ์ฉํด ์ปจํธ๋กค๋ฌ์ CRUD๋ฅผ ๊ตฌํํ๋ค.
import com.codessquad.qna.User;
import com.codessquad.qna.repository.UserReopsitory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
import java.util.List;
@Controller
public class UserController {
@Autowired
private UserReopsitory userReopsitory;
@PostMapping("/user/create")
public String createUser(User user) {
userReopsitory.save(user); // ์ ์ฅ
return "redirect:/users";
}
@GetMapping("/users")
public String showUser(Model model) {
Iterable<User> allUsers = userReopsitory.findAll(); // ๋ชจ๋ ์กฐํ
model.addAttribute("users", allUsers);
return "list";
}
@GetMapping("/{id}")
public ModelAndView showProfile(@PathVariable Long id) {
ModelAndView modelAndView = new ModelAndView("userProfile");
modelAndView.addObject("user", userRepository.findById(id).get());
return modelAndView;
}
// codes..
}
@Autowired
private UserReopsitory userReopsitory;
: ์คํ๋ง์ด ์๋ ์์ฑํด ์ค UserRepository์ ๊ตฌํ์ฒด๋ฅผ, ์ธ์คํด์ค๋ณ์
UserRepository
์ ์ฃผ์ ํด ์ค๋คModelAndView
์ด์ ์คํ๋ง ์ฑ์ ์คํํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธํ ๋ค H2๋ฅผ ํ์ธํ๋ฉด ๊ฐ์ด ์ ๋ค์ด๊ฐ ์์ ๊ฒ์ด๋ค.
'๐ฅ BE ๋ฐฑ์๋ > Spring ์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] CrudRepository์ ๋ฉ์๋ & JpaRepository์ CrudRepository์ ์ฐจ์ด (0) | 2021.03.20 |
---|---|
@RequestMapping ์ผ๋ก ์ค๋ณตURL ์ ๊ฑฐํ๊ธฐ (0) | 2021.03.17 |
Heroku๋ก ์คํ๋ง ์ฑ ๋ฐฐํฌํ๊ธฐ (0) | 2021.03.15 |
[Spring] @RequestParam, @PathVariable ์ฐจ์ด (0) | 2021.03.11 |
ํ์๊ฐ์ ๋ฐ ํ์์กฐํ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ - <form>, GET/POST, ๋ฆฌ๋ค์ด๋ ์ (0) | 2021.03.09 |