10.Spring(DB)

๋ฐ•์ข…ํ˜„ยท2024๋…„ 2์›” 25์ผ

์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
10/14
post-thumbnail

๐Ÿ“š DB ๊ด€๋ฆฌ

DB๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” DML(SELECT, INSERT, DELETE, UPDATE)์— ๊ด€ํ•ด์„œ ์ž˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ข…๋ฅ˜์„ค๋ช…
SELECTํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ํŠœํ”Œ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
INSERTํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด ํŠœํ”Œ์„ ์‚ฝ์ž…ํ•œ๋‹ค.
DELETEํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ํŠœํ”Œ์„ ์‚ญ์ œํ•œ๋‹ค.
UPDATEํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ํŠœํ”Œ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

Spring JPArepository๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์ธ ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•ด์ค˜ ํŽธํ•˜๊ฒŒ DB๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค. ์›๋ž˜๋ผ๋ฉด ๋งŒ๋“ค์–ด์•ผ ํ•  findBy~, getBy~, flush๋“ฑ์„ ์ œ๊ณตํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  findBy, getBy ์ดํ›„์— ์›ํ•˜๋Š” ์ปฌ๋Ÿผ๋ช…์„ ์ง‘์–ด๋„ฃ์–ด ์ž์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ๊นŒ์ง€ ํ•ด์ฃผ์–ด ํŽธ์˜์„ฑ์„ ๋” ์ฆ๊ฐ€์‹œ์ผœ์ฃผ์–ด์„œ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

1. INSERT

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์— ์ ์šฉ๋œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2. SELECT

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์ด ์•„๋‹ˆ๋ผ๋ฉด ~~๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.' ๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋‹ค.

3. DELETE

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์— ์ ์šฉ๋œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

4. UPDATE

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์— ์ ์šฉ๋œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐœ์ƒํ•œ ๋ฌธ์ œ ๋ฐ ํ•ด๊ฒฐ

1. Optional ๊ฐ์ฒด

findBy~๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Optional ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค. Optional์€ Null์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ์ฒด์ด๋‹ค. ์ฆ‰ findBy~๋ฅผ ํ–ˆ์„ ๋•Œ, ๊ฐ™์€ ๊ฐ’์ด ์—†๋‹ค๋ฉด ๋‹น์—ฐํžˆ ๋ฐ˜ํ™˜๊ฐ’์€ Null์ด๋‚˜ empty๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋˜์—ˆ์„ ๋•Œ, Optional์ด ์•„๋‹Œ ๊ทธ๋ƒฅ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Optional๋กœ ๋žฉํ•‘ํ•œ๋‹ค๊ณ  ํ•˜๊ณ , ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ifpresent๋‚˜ orelse(Get)์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ Null ๊ฒ€์‚ฌ๋ฅผ ์‹œํ–‰ํ•˜๊ณ , get์„ ์ด์šฉํ•˜์—ฌ ๋ฐ›์•„์˜ค๋ฉด ๋œ๋‹ค. Optional์„ ๋‹ค๋ฃจ๋Š”๋ฐ ์žˆ์–ด์„œ ํฐ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์—ˆ๊ณ  ํ•œ๋ฒˆ์”ฉ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ ๋‹ค.

2. auto_increment ์ดˆ๊ธฐํ™”

Auto_increment๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด id๊ฐ’์ด ๊ณ„์† 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์—ˆ๋‹ค. ํ•˜์ง€๋งŒ Delete๋ฅผ ํ•˜์—ฌ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์„ ์ €์žฅํ•ด๋„ id์€ ์ดˆ๊ธฐํ™”๋˜์ง€์•Š๊ณ  ์ œ๊ฑฐํ•œ id๊ฐ€ 1์ด์˜€๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์€ id๋ฅผ 2๋ฅผ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค. ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๋ฐฉ์•ˆ์œผ๋กœ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๊ฒƒ์€

  1. delete ํ–ˆ์„๋•Œ id๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.
  2. id๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ธฐ์ „์— ์ €์žฅํ•ด๋‘๊ณ , ๋‹ค์Œ์— ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•˜์ง€๋งŒ test๋Š” ๊ฐ„๋‹จํ•˜๋ฉด ๊ฐ„๋‹จํ•  ์ˆ˜๋ก ์ข‹๋‹ค๋Š” ๋ง์„ ๋ณด๊ณ , ์ง€๊ธˆ ์—ฐ์Šตํ•˜๋Š” ๊ณผ์ •์—์„œ๋Š” 1๋ฒˆ์„ ์‹คํ–‰ํ•ด๋ณด๊ณ ์ž ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜์˜€๋‹ค. ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค. table์„ TRUNCATEํ•˜์—ฌ id๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์˜€๋‹ค. repository์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    @Modifying
    @Query(
            value = "truncate table (tablename)",
            nativeQuery = true
    )
    void truncateMyTable();

๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ DELETE์— ๋ฉ”์„œ๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด, DELETEํ•˜๊ณ  ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด 1๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” id๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€