Home [Error Log] After saving the identifier must not be null
Post
Cancel

[Error Log] After saving the identifier must not be null

์—๋Ÿฌ ๋ฐœ์ƒ ๐Ÿšจ

Spring Data JDBC ์ˆ˜์—…์„ ์œ„ํ•œ ์ธ๋ฉ”๋ชจ๋ฆฌ(In-memory) DB์ธ H2์™€ ์ธํ…”๋ฆฌ์ œ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„์€ ์—ฐ๊ฒฐ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์ธ ๋ฉ”์„ธ์ง€๋ฅผ ์š”์ฒญํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๋ถ€๋ถ„์ด์—ˆ์ง€๋งŒ ์˜ˆ์ƒ๋ฐ–์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฐœ์ƒ๊นŒ์ง€์˜ ์—ฐ๋™ ๋ฐฉ์‹์€ ์ด๋Ÿฌํ–ˆ๋‹ค.

  1. build.gradle์˜ dependencies์— ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€
1
2
- `implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'`
- `runtimeOnly 'com.h2database:h2'`
  1. application.yml ํŒŒ์ผ์— H2 Browser ํ™œ์„ฑํ™” ์„ค์ • ์ถ”๊ฐ€

  2. ์ฝ”๋“œ ๊ตฌํ˜„

1
2
3
4
5
6
- MessageDto.class
- MessageController.class
- MessageMapper.interface
- MessageService.class
- Message.class(Entity)
- MessageRepository.interface(DB๊ณ„์ธต)
  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ํ›„ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ „์†ก

  2. ์—๋Ÿฌ ๋ฐœ์ƒ

๋ฌธ์ œ ํŒŒ์•…๐Ÿš’

๋จผ์ € ์ € ์˜ค๋ฅ˜์˜ ์˜๋ฏธ๋Š” ์‹๋ณ„์ž๋กœ ์ €์žฅ๋œ ํ›„์—๋Š” null๊ฐ’์ด ๋‚˜์˜ค๋ฉด ์•ˆ๋œ๋‹ค ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Primary key๋ฅผ ์ง€์ •ํ• ๋•Œ ์‹ค์ˆ˜๋ฅผ ํ–ˆ์„๊นŒ, SQL์—์„œ ์˜คํƒ€๊ฐ€ ์žˆ์—ˆ๋‚˜ ์‹ถ์–ด ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

1
2
3
4
5
6
# .sql
CREATE TABLE IF NOT EXISTS MESSAGE (
    message_id bigint NOT NULL AUTO_INCREMENT,
    message varchar(100) NOT NULL,
    PRIMARY KEY (message_id)
);

.sql ํŒŒ์ผ์—์„œ๋Š” ์ž˜๋ชป๋œ๊ฑธ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. id๋ฅผ Primary key๋กœ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๊ฐ’์„ ํฌํ•จ์‹œ์ผœ์ฃผ๋Š” AUTO_INCREMENT๋„ ์ž˜ ์ ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋” ์•Œ์•„๋ณด์•˜๋”๋‹ˆ ์•Œ๊ฒŒ๋œ๊ฒŒ ์žˆ์—ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ณ„์ธต์—์„œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๋™์„ ๋‹ด๋‹นํ•˜๋Š” MessageRepository.Interface๋Š” CrudRepository.Interface๋ฅผ ์ƒ์†๋ฐ›๊ณ ์žˆ๋‹ค.
1
2
3
// MessageRepository.Interface
public interface MessageRepository extends CrudRepository<Message, Long> {
}
  • CrudRepository.Interface๋Š” Spring์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

  • MessegeService.class์—์„œ DI๋ฅผ ํ†ตํ•ด MessageRepository.Interface๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•  ๋•Œ save()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

1
2
3
public Message createMessage(Message message) {
        return messageRepository.save(message);
}
  • save() ์‚ฌ์šฉ์‹œ ์ปฌ๋Ÿผ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด null๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค ์ฐธ๊ณ 

ํ•ด๊ฒฐ๐Ÿง

์ด ์‚ฌ์‹ค์„ ์•Ž๊ณผ ๋™์‹œ์— Message.class ํŒŒ์ผ์„ ๋ฐ”๋กœ ์—ด์–ด๋ณด์•˜๋”๋‹ˆ..

1
2
3
4
5
// Message.class
public class Message {
    private long messageId;
    private String message;
}

โ€ฆโ€ฆโ€ฆโ€ฆ.

์ž ์‹œ ํ•  ๋ง์„ ์žƒ๊ณ  ์ณ๋‹ค๋ณด๋‹ค๊ฐ€ ์ฒœ์ฒœํžˆ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ๋‹ค.

1
2
3
4
5
6
7
import org.springframework.data.annotation.Id;

public class Message {
    @Id
    private long messageId;
    private String message;
}

์˜ค๋ฅ˜๊ฐ€ ์–ธ์ œ ์žˆ์—ˆ๋ƒ๋Š”๋“ฏ์ด ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค! ๋‚ด ๋ง๋„ ์•ˆ๋˜๋Š” ์‹ค์ˆ˜ ๋•๋ถ„์— ์˜ค๋Š˜๋„ ์ง€์‹์ด ์ƒ์Šนํ•œ๋‹ค!!๐Ÿ˜‚

This post is licensed under CC BY 4.0 by the author.

[Spring] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

[Spring] JDBC