[์ผ์ •๊ด€๋ฆฌ์•ฑ Develop-2] ์ผ์ •๊ด€๋ฆฌ์•ฑ Develop ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

2025. 4. 3. 23:04ยท๋‚ด์ผ๋ฐฐ์›€์บ ํ”„/๋ณธ์บ ํ”„ ๊ณผ์ œ

"User CRUD, Schedule CRUD, ์„ธ์…˜/์ฟ ํ‚ค๋ฅผ ํ™œ์šฉํ•œ ์ธ์ฆ/์ธ๊ฐ€" ๊ตฌํ˜„ ์ค‘ ๋ฐœ์ƒํ•œ troubleshooting


๐Ÿ’ฅ ๋ฌธ์ œ1. ์ƒ์„ฑ์ž์— final ํ•„๋“œ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š์Œ

๐Ÿคฏ ๋‚˜์˜ ์ƒํ™ฉ

User ๊ฐ์ฒด๋ฅผ ํ†ต์งธ๋กœ ๋ฐ›์•„์˜ค๋ฉด ํ•„๋“œ ์ฃผ์ž…์„ ์•ˆํ•ด๋„ ๋˜๋Š”์ค„(?)์•Œ์•˜๋‹ค. (= ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๋Š” ์ค„ ์•Œ์•˜๋‹ค)

 

๐Ÿฅธ ๋ฌธ์ œ ์ƒํ™ฉ

โœ”๏ธ ์ƒ์„ฑ์ž์— User ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ๋†“๊ณ , ์•„๋ฌด ํ•„๋“œ๋„ ์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š์•˜๋‹ค.
โœ”๏ธ ํ•„๋“œ์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ userId,UserName,email ๋ชจ๋‘ null๋กœ ๋‚จ๋Š”๋‹ค.
โœ”๏ธ ๊ทธ๋Ÿฐ๋ฐ final์ด ๋ถ™์€ ํ•„๋“œ์˜ ๊ฒฝ์šฐ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๐Ÿ”ฅ ๋ฌธ์ œ ์ฝ”๋“œ

@Getter
public class SignUpResponseDto {

    private final Long userId;

    private final String userName;

    private final String email;

    public SignUpResponseDto(User user) {
    	// โŒuser๋ฅผ ๋ฐ›๊ธฐ๋งŒ ํ•˜๊ณ  final ํ•„๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์•˜๋‹ค.
    }
}

 

๐Ÿช„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

User๊ฐ์ฒด์—์„œ ๊ฐ’์„ ๊บผ๋‚ด์„œ ๊ฐ๊ฐ ํ•„๋“œ์— ์ง‘์–ด ๋„ฃ์–ด์ค€๋‹ค.

 

๐Ÿ’ง ํ•ด๊ฒฐ ์ฝ”๋“œ

@Getter
public class SignUpResponseDto {

    private final Long userId;

    private final String userName;

    private final String email;

    public SignUpResponseDto(User user) { 
    	// โ˜‘๏ธ final ํ•„๋“œ๋Š” ์ƒ์„ฑ์ž์—์„œ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”
    	this.userId = user.getUserId();
        this.userName = user.getUserName();
        this.email = user.getEmail();
    }
}

โœ๏ธ finalํ•„๋“œ๋Š” ์ƒ์„ฑ ์‹œ ๋ฐ˜๋“œ์‹œ ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ƒ์„ฑ์ž์—์„œ ๊ฐ’์„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.


๐Ÿ’ฅ ๋ฌธ์ œ2. findByEmail()์‚ฌ์šฉ ์‹œ ์„ ์–ธํ•˜์ง€ ์•Š์•„ ์ƒ๊ธด ์˜ค๋ฅ˜

๐Ÿคฏ ๋‚˜์˜ ์ƒํ™ฉ

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ์„ ๊ธฐ์ค€์œผ๋กœ User์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์–ด์„œ findById()๋ฅผ ๋”ฐ๋ผ findByEmail()์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. findById๋Š” ๋˜๋Š”๋ฐ.. ๊ทธ๋ ‡๋‹ค๊ณ  findByEmail์„ ์–ด๋””์— ์„ ํ•ด์•ผํ•˜๋Š”์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค.

 

๐Ÿฅธ ๋ฌธ์ œ ์ƒํ™ฉ

โœ”๏ธ findById()๋Š” JpaRepository๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ผ์„œ ์•„๋ฌด ์„ ์–ธ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ–ˆ๋‹ค.
โœ”๏ธ ํ•˜์ง€๋งŒ findByEmail()๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ ์ œ๊ณต์ด ์•„๋‹ˆ๊ณ ,  ์ง์ ‘ ์„ ์–ธํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋Š” ๋ฐ”๋กœ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค.
โœ”๏ธ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค.

 

๐Ÿ”ฅ ๋ฌธ์ œ ์ฝ”๋“œ

// โŒ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ๋ฐ”๋กœ ์‚ฌ์šฉ
User user = userRepository.findByEmail(email)
        .orElseThrow(() -> new RuntimeException("ํ•ด๋‹น ์ด๋ฉ”์ผ ์—†์Œ"));

๐Ÿ’ข ์—๋Ÿฌ ๋ฉ”์‹œ์ง€: Cannot resolve method 'findByEmail' in 'UserRepository'

 

๐Ÿช„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

JpaRepository๋Š” findById, findAll๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋งŒ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋ฉฐ,
findByEmail, findByUserName๊ณผ ๊ฐ™์€ ์ปค์Šคํ…€ ๋ฉ”์„œ๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์„ ์–ธํ•œ๋‹ค.
๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ JPA ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ ๊ทœ์น™์— ๋งž์ถฐ ์ž‘์„ฑํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

๐Ÿ’ง ํ•ด๊ฒฐ ์ฝ”๋“œ

// โœ… UserRepository ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์„œ๋“œ ์„ ์–ธ ์ถ”๊ฐ€
Optional<User> findByEmail(String email);

User user = userRepository.findByEmail(email)
        .orElseThrow(() -> new RuntimeException("ํ•ด๋‹น ์ด๋ฉ”์ผ ์—†์Œ"));

โœ๏ธ findByํ•„๋“œ๋ช…(๋ฐ์ดํ„ฐํƒ€์ž… ํ•„๋“œ๋ช…) ํ˜•์‹์œผ๋กœ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์ง€์œผ๋ฉด, JPA๊ฐ€ ์ž๋™์œผ๋กœ SQL์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

โœ๏ธ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ๊ผญ ์ธํ„ฐํŽ˜์ด์Šค์— ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•œ๋‹ค.

โœ๏ธ Optional๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ  : User๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 


๐Ÿ’ฅ ๋ฌธ์ œ3. ์„ธ์…˜์—์„œ ์‚ฌ์šฉํ•œ ํ‚ค๋ฅผ ์ผ์น˜์‹œํ‚ค์ง€ ์•Š์•„ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์Œ

๐Ÿคฏ ๋‚˜์˜ ์ƒํ™ฉ

๋กœ๊ทธ์ธ ํ›„์—๋Š” ์„ธ์…˜์ด ์ƒ์„ฑ๋˜์–ด์•ผ ํ•˜๋‹ˆ๊นŒ session.getAttribute()๋กœ ์œ ์ €๋ฅผ ๊บผ๋‚ด์˜ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•  ์ค„ ์•Œ์•˜๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋กœ๊ทธ์ธ์ด ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ "๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค"๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ–ˆ๋‹ค.

 

๐Ÿฅธ ๋ฌธ์ œ ์ƒํ™ฉ

โœ”๏ธ ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์„ธ์…˜์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋•Œ user๋ผ๋Š” ํ‚ค๋กœ ์ €์žฅํ–ˆ๋‹ค.
โœ”๏ธ ๊ทธ๋Ÿฐ๋ฐ ํ•„ํ„ฐ์—์„œ๋Š” session.getAttribute("sessionKey")๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์—ˆ๋‹ค. (์‹ค์Šต ์ฝ”๋“œ ๋”ฐ๋ผ ์“ฐ๋А๋ผ ใ… ใ… )
โœ”๏ธ ์ฆ‰, ํ‚ค ์ด๋ฆ„์ด ๋‹ฌ๋ผ์„œ ํ•ญ์ƒ null์ด ๋ฐ˜ํ™˜๋˜์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ”ฅ ๋ฌธ์ œ ์ฝ”๋“œ

// ๋กœ๊ทธ์ธ ์‹œ
session.setAttribute("user", user);

// ํ•„ํ„ฐ์—์„œ ํ™•์ธํ•  ๋•Œ (โŒ ํ‚ค ์ด๋ฆ„ ๋‹ค๋ฆ„)
if (session == null || session.getAttribute("sessionKey") == null) {
    throw new RuntimeException("๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.");
}

 

๐Ÿช„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์„ธ์…˜์—์„œ ๊ฐ’์„ ๊บผ๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค ์ด๋ฆ„์„, ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ ํ‚ค ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜์‹œ์ผœ์•ผ ํ•œ๋‹ค. (๋‘˜ ๋‹ค user๋กœ ์ผ์น˜์‹œํ‚จ๋‹ค.)

 

๐Ÿ’ง ํ•ด๊ฒฐ ์ฝ”๋“œ

// ๋กœ๊ทธ์ธ ์‹œ
session.setAttribute("user", user);

// ํ•„ํ„ฐ์—์„œ ํ™•์ธํ•  ๋•Œ (โœ… ํ‚ค ์ด๋ฆ„ ์ผ์น˜)
if (session == null || session.getAttribute("user") == null) {
    throw new RuntimeException("๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.");
}

โœ๏ธ ์„ธ์…˜์— ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ ํ‚ค ์ด๋ฆ„๊ณผ, ๊บผ๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค ์ด๋ฆ„์„ ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค.

โœ๏ธ ํ‚ค๊ฐ€ ๋‹ค๋ฅด๋ฉด null์ด ๋ฐ˜ํ™˜๋˜์–ด, ์ธ์ฆ์— ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค.


โ‡๏ธ ๋ฐฐ์šด์  ์š”์•ฝ

  • final ํ•„๋“œ๋Š” ์ƒ์„ฑ ์‹œ ๋ฐ˜๋“œ์‹œ ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•ด์ค˜์•ผํ•œ๋‹ค.
  • JpaRepository์—์„œ ํŠน์ • ํ•„๋“œ์— ๋”ฐ๋ฅธ ๊ฐ’์„ ์ฐพ๊ณ  ์‹ถ์„๋•Œ๋Š” findByํ•„๋“œ๋ช…() ํ•จ์ˆ˜๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธํ•œ๋‹ค.
  • ์„ธ์…˜์„ ํ™œ์šฉํ•ด ์ธ์ฆ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ key๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ์ผ์น˜์‹œํ‚ค๋„๋ก ํ™•์ธํ•œ๋‹ค.

'๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ > ๋ณธ์บ ํ”„ ๊ณผ์ œ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring ์‹ฌํ™”] ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ œ ํšŒ๊ณ   (4) 2025.04.18
[์ผ์ •๊ด€๋ฆฌ์•ฑ Develop-3] ์ผ์ •๊ด€๋ฆฌ์•ฑ Develop ๊ณผ์ œ ํšŒ๊ณ   (1) 2025.04.04
[์ผ์ •๊ด€๋ฆฌ์•ฑ Develop-1] ERD ๋ฐ API ๋ช…์„ธ์„œ ์ž‘์„ฑ  (0) 2025.04.02
[์ผ์ •๊ด€๋ฆฌ์•ฑ ๋งŒ๋“ค๊ธฐ-3] ์ผ์ •๊ด€๋ฆฌ์•ฑ ๊ณผ์ œ ํšŒ๊ณ   (1) 2025.03.26
[์ผ์ •๊ด€๋ฆฌ์•ฑ ๋งŒ๋“ค๊ธฐ-2][ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] DB์—†์ด CRUD ๋งŒ๋“ค๊ธฐ  (0) 2025.03.24
'๋‚ด์ผ๋ฐฐ์›€์บ ํ”„/๋ณธ์บ ํ”„ ๊ณผ์ œ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring ์‹ฌํ™”] ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ œ ํšŒ๊ณ 
  • [์ผ์ •๊ด€๋ฆฌ์•ฑ Develop-3] ์ผ์ •๊ด€๋ฆฌ์•ฑ Develop ๊ณผ์ œ ํšŒ๊ณ 
  • [์ผ์ •๊ด€๋ฆฌ์•ฑ Develop-1] ERD ๋ฐ API ๋ช…์„ธ์„œ ์ž‘์„ฑ
  • [์ผ์ •๊ด€๋ฆฌ์•ฑ ๋งŒ๋“ค๊ธฐ-3] ์ผ์ •๊ด€๋ฆฌ์•ฑ ๊ณผ์ œ ํšŒ๊ณ 
aggeeeee
aggeeeee
ใ€€ φ(๏ผŽ๏ผŽ;)ใ€€๐Ÿ”œใ€€\_ใธ(โ–ญ-โ–ญ)โœจ
  • aggeeeee
    ๐Ÿฅ” ๋‹˜์˜ ๋ธ”๋กœ๊ทธ
    aggeeeee
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (155)
      • Today I Learned (25)
      • ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ (115)
        • ๋ณธ์บ ํ”„ ๊ณผ์ œ (17)
        • ์‚ฌ์ „์บ ํ”„ ๊ณผ์ œ (23)
        • SQL ์ฝ”๋“œ์นดํƒ€ (44)
        • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ์นดํƒ€ (31)
      • ๐Ÿ’ป๐Ÿš€ (15)
        • Java (7)
        • Git & GitHub (1)
        • CS (4)
        • Spring & SpringBoot (3)
  • ๋งํฌ

  • ์ตœ๊ทผ ๊ธ€

  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
aggeeeee
[์ผ์ •๊ด€๋ฆฌ์•ฑ Develop-2] ์ผ์ •๊ด€๋ฆฌ์•ฑ Develop ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”