DB๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ DML(SELECT, INSERT, DELETE, UPDATE)์ ๊ดํด์ ์ ์ฒ๋ฆฌ๊ฐ ๋๋์ง ํ์ธํด๋ณด๋ ค๊ณ ํ๋ค.
| ์ข ๋ฅ | ์ค๋ช |
|---|---|
| SELECT | ํ ์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง๋ ํํ์ ๊ฒ์ํ๋ค. |
| INSERT | ํ ์ด๋ธ์ ์๋ก์ด ํํ์ ์ฝ์ ํ๋ค. |
| DELETE | ํ ์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง๋ ํํ์ ์ญ์ ํ๋ค. |
| UPDATE | ํ ์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง๋ ํํ์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ค. |
Spring JPArepository๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋๋ค์ ์ ๊ณตํด์ค ํธํ๊ฒ DB๋ฅผ ๊ด๋ฆฌํ ์ ์๋๋ก ๋ง๋ค์ด์ค๋ค. ์๋๋ผ๋ฉด ๋ง๋ค์ด์ผ ํ findBy~, getBy~, flush๋ฑ์ ์ ๊ณตํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ findBy, getBy ์ดํ์ ์ํ๋ ์ปฌ๋ผ๋ช ์ ์ง์ด๋ฃ์ด ์์ ์ด ์ํ๋ ๊ฒ์ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ๊น์ง ํด์ฃผ์ด ํธ์์ฑ์ ๋ ์ฆ๊ฐ์์ผ์ฃผ์ด์ ํธํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
insert๋ฅผ ์ํด์ sava๋ฅผ ์ด์ฉํด ์ ์ฅํ๋ ๊ฒ์ ๊ตฌํํ ๊ฒ์ด๋ค. ์ด๊ฑด ๊ฐ์์์ ๋์จ ๋ด์ฉ์ ์ด์ฉํ์ฌ ๋ง๋ค์ด๋ณผ ์ ์๋ค.
@Test
// @Commit
void join() throws Exception {
//given
User user = new User();
user.setName("hello");
user.setPassword("hello");
user.setAge(60);
user.setAddress("์์ฒ");
//when
Long saveId = userService.join(user);
//then
User findUser = userService.findOne(saveId).get();
Assertions.assertThat(user.getName()).isEqualTo(findUser.getName());
}
public Long join(User user){
validateDuplicateUser(user);
userRepository.save(user);
return user.getid();
}
public void validateDuplicateUser(User user){
userRepository.findByName(user.getName())
.ifPresent(m -> {throw new IllegalStateException("์ด๋ฏธ ์กด์ฌํ๋ ํ์์
๋๋ค.");});
}
user ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , user service์ joinํจ์๋ฅผ ์ด์ฉํ๋ค. joinํจ์๋ save ํจ์๋ฅผ ์ฌ์ฉํ์ฌ, DB์ INSERTํ๊ณ , id๋ฅผ ๋ฐํํ๋ ์ฝ๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ฅํ user ์ด๋ฆ์ ๋ฐ์์์ ์ ์ฅํ๋ ค๊ณ ํ ์ด๋ฆ๊ณผ ๊ฐ์์ง ๊ฒ์ฌํ๋ ์ฝ๋์ด๋ค. test๋ฅผ ์คํ์ํค๋ฉด ์ฑ๊ณตํ ๋ชจ์ต์ ์ ์ ์๋ค.

commit์ ํ๋ฉด, DB์ ์ ์ฉ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.

SELECT๋ฅผ ๊ตฌํํ๊ธฐ ์ํด, findByName์ ์ฌ์ฉํ ๊ฒ์ด๋ค. ๋จผ์ ์ฝ๋๋ฅผ ์ํด, repository์์ findbyName์ ๋ง๋ค์ด์ค๋ค.
Optional<User> findByName(String name);
๊ทธ๋ฆฌ๊ณ , findByName์ ํ์ฉํด name์ผ๋ก SELECT๋ฅผ ๊ตฌํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
@Test
public void SELECT_ํ์ธ() throws Exception {
String wantname = "hello";
repository.findByName(wantname).ifPresent(user1 ->
{System.out.println("Name: "+ user1.getName()); System.out.println("Age: "+ user1.getAge());});
}
์ํ๋ ์ด๋ฆ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต๋ฐ์๋ค๊ณ ์ ์ ์ ๋์ด์, wantname์ด๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ ์ํ๋ ์ด๋ฆ์ ์ ์ฅํด๋๋ค. ๊ทธ๋ฆฌ๊ณ findByName์ ์ด์ฉํด์ ์ด๋ฆ์ ์ด์ฉํด ์ฐพ๋๋ค. ifPresent๋ ์์ ๊ฐ์ด NULL์ด ์๋๋ผ๋ฉด, ์คํํ๋ ๋ฉ์๋๋ก, 'NULL์ด ์๋๋ผ๋ฉด ~~๋ฅผ ์ถ๋ ฅํ๋ผ.' ๋ผ๋ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.

DELETE๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์๊น์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก deleteByName์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์์ฑํด์ฃผ๊ณ , ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
@Test
//@Commit
public void DELETE_ํ์ธ() throws Exception {
String wantdel = "hello";
repository.deleteByName(wantdel);
if(repository.findByName(wantdel).isEmpty()){
System.out.println("์ ์ ๊ฑฐ ๋์์ต๋๋ค.");
}
}
์ํ๋ ์ด๋ฆ์ ์ง์ ํ๊ณ , deleteByName์ ์ด์ฉํ์ฌ ์ํ๋ ์ด๋ฆ์ ์ ๊ฑฐํ๋ ์ฝ๋์ด๋ค. ์ ์ ๊ฑฐ ๋์๋์ง ์์ ์ฝ๋์์ ์์ฑํ findByName์ ์ด์ฉํด ์ฐพ๊ณ ์๋ค๋ฉด, ์ ์ ๊ฑฐ๋์๋ค๋ ์ถ๋ ฅ์ ์คํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.

commit์ ํ๋ฉด, DB์ ์ ์ฉ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.

JPA์์๋ DB์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ , ๊ฐ์ ์์ ํ๊ฒ ๋๋ฉด ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ , ๋ณํ๋ ๊ฐ์ DB์ ์ ์ฉ์์ผ์ฃผ์ด์ ํธ๋ฆฌํ๊ฒ UPDATE๊ฐ ๊ฐ๋ฅํ๋ค.
@Test
//@Commit
public void UPDATE_ํ์ธ() throws Exception {
String username = "hello";
int wantage = 30;
repository.findByName(username).ifPresent(user -> {
user.setAge(wantage);
});
}
์์ ์ ์ํ๋ ์ ์ ์ ์ด๋ฆ๊ณผ ์์ ํ๊ณ ์ถ์ ๊ฐ์ ์ ์ฅํ ํ, findByName์ ์ด์ฉํด ๊ฐ์ ๋ถ๋ฌ์ค๊ณ , ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด setter๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ ์์ ํ๋ฉด UPDATE๋ ์ด๊ฒ ๋์ด๋ค.

commit์ ํ๋ฉด, DB์ ์ ์ฉ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.

findBy~๋ฅผ ์ฌ์ฉํ๋ฉด Optional ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค. Optional์ Null์ด ๋ค์ด์ฌ ์ ์๋ค๋ ๊ฐ์ฒด์ด๋ค. ์ฆ findBy~๋ฅผ ํ์ ๋, ๊ฐ์ ๊ฐ์ด ์๋ค๋ฉด ๋น์ฐํ ๋ฐํ๊ฐ์ Null์ด๋ empty๊ฐ ๋๊ฒ ๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ๋์์ ๋, Optional์ด ์๋ ๊ทธ๋ฅ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ฅผ ์ํด Optional๋ก ๋ฉํํ๋ค๊ณ ํ๊ณ , ์ฒ๋ฆฌํ ๋๋ ifpresent๋ orelse(Get)์ ํ์ฉํ์ฌ ๊ฐ์ฒด์ Null ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ , get์ ์ด์ฉํ์ฌ ๋ฐ์์ค๋ฉด ๋๋ค. Optional์ ๋ค๋ฃจ๋๋ฐ ์์ด์ ํฐ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์๊ณ ํ๋ฒ์ฉ ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฒ ๊ฐ์ ๋๋์ด ๋ ๋ค.
Auto_increment๋ฅผ ์ง์ ํด์ฃผ์ด id๊ฐ์ด ๊ณ์ 1์ฉ ์ฆ๊ฐํ๋ ํ ์ด๋ธ์ ๋ง๋ค์๋ค. ํ์ง๋ง Delete๋ฅผ ํ์ฌ ์ ๊ฑฐํ๊ณ ์๋ก์ด ๊ฐ์ ์ ์ฅํด๋ id์ ์ด๊ธฐํ๋์ง์๊ณ ์ ๊ฑฐํ id๊ฐ 1์ด์๋ค๋ฉด ์๋ก์ด ๊ฐ์ id๋ฅผ 2๋ฅผ ์ง์ ํด์ฃผ์๋ค. ์ด๊ฒ์ ํด๊ฒฐํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ด๊ฐ ์๊ฐํ ๊ฒ์
- delete ํ์๋ id๊ฐ์ ์ด๊ธฐํํด์ค๋ค.
- id๊ฐ์ ์ ๊ฑฐํ๊ธฐ์ ์ ์ ์ฅํด๋๊ณ , ๋ค์์ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ค.
ํ์ง๋ง test๋ ๊ฐ๋จํ๋ฉด ๊ฐ๋จํ ์๋ก ์ข๋ค๋ ๋ง์ ๋ณด๊ณ , ์ง๊ธ ์ฐ์ตํ๋ ๊ณผ์ ์์๋ 1๋ฒ์ ์คํํด๋ณด๊ณ ์ ํ์ฌ ๊ฒ์ํ์๋ค. ํด๊ฒฐ๋ฐฉ๋ฒ์ ๋ฐ๊ฒฌํ์๋ค. table์ TRUNCATEํ์ฌ id๋ฅผ ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ์ด์๋ค. repository์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
@Modifying
@Query(
value = "truncate table (tablename)",
nativeQuery = true
)
void truncateMyTable();
๊ทธ๋ฆฌ๊ณ ๋์ DELETE์ ๋ฉ์๋๋ฅผ ๋ฃ์ด์ฃผ๋ฉด, DELETEํ๊ณ ํ
์ด๋ธ์ ์ด๊ธฐํํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ค๋ฉด 1๋ถํฐ ๋ค์ ์์ํ๋ id๋ฅผ ๋ณผ ์ ์๋ค.