๐Ÿฏ[TIL] 250722-036

byoยท2025๋…„ 7์›” 29์ผ

๐Ÿ’ซ JAVA

๐Ÿ Board_with_bcrypt

๐ŸŒฟ git

โœ… 1. ๊ฐœ์š”

๊ตฌ์„ฑ ์š”์†Œ์„ค๋ช…๋น„์œ 
๋ชจ๋ธ(Model)๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์™€ ๊ด€๊ณ„๋ฅผ ์ •์˜๊ฑด๋ฌผ์˜ ์„ค๊ณ„๋„(์–ด๋–ค ๋ฐฉ์ด ์žˆ๊ณ , ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€)
DTO๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” "ํ˜•์‹"ํƒ๋ฐฐ ์ƒ์ž(๋‚ด๋ถ€ ๋ฌผ๊ฑด์€ ์„ค๊ณ„๋„์— ๋งž์ง€๋งŒ, ์šด์†ก ์‹œ ํฌ์žฅ๋ฐฉ์‹์€ ๋”ฐ๋กœ)
๋ฆฌํฌ์ง€ํ† ๋ฆฌ(Repository)DB์— ์ ‘๊ทผํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ฐฝ๊ณ  ๊ด€๋ฆฌ์ž(๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๊ณ  ์ €์žฅ)
์„œ๋น„์Šค(Service)๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(๊ทœ์น™, ์ ˆ์ฐจ)์ฃผ๋ฐฉ์˜ ์…ฐํ”„(์žฌ๋ฃŒ๋ฅผ ์กฐํ•ฉํ•ด ์š”๋ฆฌ๋ฅผ ๋งŒ๋“ฆ)
์ปจํŠธ๋กค๋Ÿฌ(Controller)HTTP ์š”์ฒญ์„ ๋ฐ›๊ณ  ์‘๋‹ต์‹๋‹น์˜ ์›จ์ดํ„ฐ(์†๋‹˜ ์ฃผ๋ฌธ์„ ๋ฐ›๊ณ  ์…ฐํ”„์—๊ฒŒ ์ „๋‹ฌ, ๊ฒฐ๊ณผ ์ „๋‹ฌ)
๊ธฐ์ˆ  ๋ชจ๋“ˆBCrypt, Pageable, JPA ๋“ฑ์ฃผ๋ฐฉ ๋„๊ตฌ(๋ฏน์„œ๊ธฐ, ์˜ค๋ธ, ์นผ ๋“ฑ ํŠน์ • ๋ชฉ์ ์˜ ๋„๊ตฌ)

โ‡๏ธ 2. ํŒŒ์ผ๋ณ„ ์—ญํ• 

๐Ÿง  Model

User.java

  • ์—ญํ• : ํšŒ์› ์ •๋ณด(์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ)๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”.
  • ์ค‘์š” ํฌ์ธํŠธ
    • @Entity โ†’ ์ด ํด๋ž˜์Šค๋Š” DB ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋จ.
    • @Table(name="users") โ†’ ํ…Œ์ด๋ธ” ์ด๋ฆ„ ์ง€์ •.
    • @Column(unique = true) โ†’ ์•„์ด๋”” ์ค‘๋ณต ๋ฐฉ์ง€.
    • passwordHash โ†’ ๋น„๋ฐ€๋ฒˆํ˜ธ ์›๋ฌธ์ด ์•„๋‹ˆ๋ผ ํ•ด์‹œ ๊ฐ’ ์ €์žฅ (BCrypt๋กœ ์ƒ์„ฑ).

Post.java

  • ์—ญํ• : ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ. ์ œ๋ชฉ, ๋‚ด์šฉ, ์ž‘์„ฑ์ž, ๋Œ“๊ธ€ ๋ชฉ๋ก ํฌํ•จ.
  • ๊ด€๊ณ„
    • @ManyToOne User author โ†’ ๊ฒŒ์‹œ๊ธ€์€ ํ•˜๋‚˜์˜ ์ž‘์„ฑ์ž๋ฅผ ๊ฐ€์ง.
    • @OneToMany comments โ†’ ํ•˜๋‚˜์˜ ๊ฒŒ์‹œ๊ธ€์—๋Š” ์—ฌ๋Ÿฌ ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆด ์ˆ˜ ์žˆ์Œ.

Comment.java

  • ์—ญํ• : ๋Œ“๊ธ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ.
  • ๊ด€๊ณ„
    • @ManyToOne Post โ†’ ๋Œ“๊ธ€์€ ํŠน์ • ๊ฒŒ์‹œ๊ธ€์— ์†ํ•จ.
    • @ManyToOne User author โ†’ ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๋ฅผ ์ฐธ์กฐ.

๐Ÿ“ฆ DTO

DTO(Data Transfer Object)๋Š” API ์š”์ฒญ/์‘๋‹ต ์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ํฌ๋งท์ด์—์š”.
"๋‚ด๋ถ€ DB ์„ค๊ณ„ ๊ทธ๋Œ€๋กœ ์™ธ๋ถ€์— ๋ณด์—ฌ์ฃผ๋ฉด ์œ„ํ—˜"ํ•˜๋‹ˆ๊นŒ, ํฌ์žฅ ์ƒ์ž๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • PostRequestDto / PostResponseDto
    • ์š”์ฒญ DTO์—๋Š” ์ œ๋ชฉ, ๋‚ด์šฉ, ์ž‘์„ฑ์ž ์ •๋ณด๋งŒ.
    • ์‘๋‹ต DTO์—๋Š” ์ž‘์„ฑ์ž ์ •๋ณด, ๋Œ“๊ธ€ ๋ชฉ๋ก๊นŒ์ง€ ํฌํ•จ.
  • CommentRequestDto / CommentResponseDto
    • ๋Œ“๊ธ€ ์š”์ฒญ ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋„๋ก username + password ํฌํ•จ.
    • ์‘๋‹ต ์‹œ์—๋Š” ์ž‘์„ฑ์ž ์ •๋ณด์™€ ๋Œ“๊ธ€ ๋‚ด์šฉ ํฌํ•จ.
  • UserRequestDto / UserResponseDto
    • ์š”์ฒญ ์‹œ: username, password.
    • ์‘๋‹ต ์‹œ: ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ ˆ๋Œ€ ํฌํ•จ ์•ˆ ํ•จ.

๐Ÿ—„๏ธ Repository

Spring Data JPA์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋งŒ๋“ค์–ด๋„ CRUD ๊ธฐ๋Šฅ์„ ์ž๋™ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ๋น„์œ : ์ฐฝ๊ณ  ๊ด€๋ฆฌ์ž(Repository)๋Š” "๋ฌผ๊ฑด ์ฐพ๊ธฐ/์ €์žฅํ•˜๊ธฐ"๋งŒ ํ•จ. ๋ ˆ์‹œํ”ผ(๋กœ์ง)๋Š” ์•Œ ํ•„์š” ์—†์Œ.
  • UserRepository โ†’ ์‚ฌ์šฉ์ž ์กฐํšŒ ๋ฐ ์ €์žฅ.
  • PostRepository โ†’ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ, ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ง€์›.
  • CommentRepository โ†’ ๋Œ“๊ธ€ ์กฐํšŒ, ๊ฒŒ์‹œ๊ธ€ ID๋กœ ๋Œ“๊ธ€ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ.

๐Ÿงฉ Service

"๊ทœ์น™๊ณผ ์ ˆ์ฐจ"๋ฅผ ๋‹ด๋Š” ๊ณณ.
์›จ์ดํ„ฐ๊ฐ€ ์ฃผ๋ฌธ์„ ๊ฐ€์ ธ์˜ค๋ฉด, ์…ฐํ”„(Service)๊ฐ€ ์žฌ๋ฃŒ๋ฅผ ์กฐํ•ฉํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ฆ.

  • UserService
    • ํšŒ์›๊ฐ€์ž… ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ BCrypt๋กœ ํ•ด์‹œ.
    • ๋กœ๊ทธ์ธ ์‹œ ํ•ด์‹œ๊ฐ’ ๋น„๊ต.
  • PostService
    • ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ/์ˆ˜์ •/์‚ญ์ œ ์‹œ, ์ž‘์„ฑ์ž ๋ณธ์ธ์ธ์ง€ ๊ฒ€์‚ฌ.
    • ํŽ˜์ด์ง€๋„ค์ด์…˜(Pageable)์œผ๋กœ ๋ชฉ๋ก ์กฐํšŒ.
  • CommentService
    • ๋Œ“๊ธ€ ์ž‘์„ฑ/์ˆ˜์ •/์‚ญ์ œ ์‹œ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ.
    • ๋ณธ์ธ ๋Œ“๊ธ€๋งŒ ์ˆ˜์ •/์‚ญ์ œ ๊ฐ€๋Šฅ.

๐Ÿ“ก Controller

HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ.
์›จ์ดํ„ฐ์ฒ˜๋Ÿผ ์†๋‹˜๊ณผ ์ฃผ๋ฐฉ์„ ์—ฐ๊ฒฐ.

  • UserController
    • /api/users/register โ†’ ํšŒ์›๊ฐ€์ž….
  • PostController
    • /api/posts GET โ†’ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ(ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ง€์›).
    • /api/posts POST โ†’ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ.
    • /api/posts/{id} GET โ†’ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ์กฐํšŒ.
    • /api/posts/{id} PUT โ†’ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •.
    • /api/posts/{id} DELETE โ†’ ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ.
  • CommentController
    • /api/posts/{postId}/comments POST โ†’ ๋Œ“๊ธ€ ์ž‘์„ฑ.
    • /api/comments/{id} PUT โ†’ ๋Œ“๊ธ€ ์ˆ˜์ •.
    • /api/comments/{id} DELETE โ†’ ๋Œ“๊ธ€ ์‚ญ์ œ.

โœณ๏ธ 3. ๋ชจ๋“ˆ & ๊ฐœ๋…

๐Ÿ’  BCrypt

  • ์—ญํ• : ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด์‹œ(๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”)ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜.
  • ์ด์œ :
    • ์›๋ฌธ ์ €์žฅ ์‹œ ํ•ดํ‚น ์œ„ํ—˜.
    • BCrypt๋Š” "๊ฐ™์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ๋งค๋ฒˆ ๋‹ค๋ฅธ ํ•ด์‹œ"๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ณด์•ˆ ๊ฐ•ํ™”.
  • ๋น„์œ : ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ฆ™์œผ๋กœ ์งœ์„œ ๋ ˆ์‹œํ”ผ๋ฅผ ๋ฒ„๋ฆฐ ์š”๋ฆฌ์ฒ˜๋Ÿผ, ์›๋ž˜ ์žฌ๋ฃŒ(์›๋ฌธ)๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์—†์Œ.

๐Ÿ’  Pageable

  • ์—ญํ• : ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋งŒ ๋Š์–ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ(ํŽ˜์ด์ง€๋„ค์ด์…˜).
  • ์‚ฌ์šฉ ์˜ˆ์‹œ:
Pageable pageable = PageRequest.of(0, 10, Sort.by("id").descending());
postRepository.findAll(pageable);
  • ๋น„์œ : ๋„์„œ๊ด€์—์„œ ์ฑ… 1000๊ถŒ์ด ์žˆ์–ด๋„ ํ•œ ๋ฒˆ์— ์ „๋ถ€ ๊บผ๋‚ด์ง€ ์•Š๊ณ , ํ•œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ(ํŽ˜์ด์ง€)์— 10๊ถŒ์”ฉ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ.

๐Ÿ’  JPA

  • ์—ญํ• : Java ๊ฐ์ฒด์™€ DB ํ…Œ์ด๋ธ” ๋งคํ•‘, SQL ๋Œ€์‹  ๋ฉ”์„œ๋“œ๋กœ DB ์กฐ์ž‘ ๊ฐ€๋Šฅ.
  • ๋น„์œ : ์–ธ์–ด๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋ผ๋ฆฌ ๋ฒˆ์—ญ๊ธฐ๋ฅผ ๋‘๊ณ  ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ.
    • Java โ†” SQL ๋ณ€ํ™˜์„ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ๋ฒˆ์—ญ๊ธฐ.

โœณ๏ธ 4. ์ „์ฒด ํ๋ฆ„

  • ํšŒ์›๊ฐ€์ž… โ†’ UserController.register() โ†’ UserService.register() โ†’ UserRepository.save().
  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” BCrypt๋กœ ํ•ด์‹œ ํ›„ ์ €์žฅ.
  • ๋กœ๊ทธ์ธ โ†’ DB์—์„œ ์‚ฌ์šฉ์ž ์กฐํšŒ ํ›„ BCrypt๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋น„๊ต.
  • ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ โ†’ ๋กœ๊ทธ์ธ ์ธ์ฆ โ†’ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ โ†’ ์ €์žฅ.
  • ๋Œ“๊ธ€ ์ž‘์„ฑ โ†’ ๋กœ๊ทธ์ธ ์ธ์ฆ โ†’ ๋Œ“๊ธ€ ์ƒ์„ฑ โ†’ ์ €์žฅ.
  • ๋ชฉ๋ก ์กฐํšŒ โ†’ Pageable๋กœ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๊ฒŒ์‹œ๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ.


โœณ๏ธ 5. ์ ‘๊ทผ๋ฒ• & ๋น„์œ 

  • Model & ๊ด€๊ณ„ โ†’ "๊ฑด๋ฌผ ์„ค๊ณ„๋„"๋กœ ์ƒ๊ฐ.
  • DTO โ†’ "ํฌ์žฅ ์ƒ์ž". ๋‚ด๋ถ€ ๋‚ด์šฉ์€ ๊ฐ™์•„๋„ ํฌ์žฅ ๋ฐฉ์‹์€ API ๋ชฉ์ ์— ๋งž๊ฒŒ ๋ฐ”๋€œ.
  • Repository โ†’ "์ฐฝ๊ณ  ๊ด€๋ฆฌ์ž". ๋กœ์ง ์—†์ด ๋‹จ์ˆœ CRUD๋งŒ ์ˆ˜ํ–‰.
  • Service โ†’ "์…ฐํ”„". ๊ทœ์น™๊ณผ ์ ˆ์ฐจ(๋กœ์ง) ๋‹ด๋‹น.
  • Controller โ†’ "์›จ์ดํ„ฐ". ์†๋‹˜ ์š”์ฒญ์„ ์ฃผ๋ฐฉ์— ์ „๋‹ฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ.
  • BCrypt โ†’ "์ฆ™์œผ๋กœ ๋งŒ๋“ค์–ด ์žฌ๋ฃŒ๊ฐ€ ๋ณต์› ๋ถˆ๊ฐ€๋Šฅํ•œ ์š”๋ฆฌ".
  • Pageable โ†’ "์ฑ…์„ 10๊ถŒ์”ฉ๋งŒ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์•„ ๊ฐ€์ ธ์˜ค๊ธฐ".

๐Ÿ” 6. ์š”์•ฝ

๊ตฌ๋ถ„ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ์„ค๋ช…
ModelEntity, ๊ด€๊ณ„ ๋งคํ•‘DB ํ…Œ์ด๋ธ” ๊ตฌ์กฐ์™€ ๊ด€๊ณ„๋ฅผ Java ๊ฐ์ฒด๋กœ ํ‘œํ˜„
DTO์š”์ฒญ/์‘๋‹ต ํฌ๋งทAPI ๋ฐ์ดํ„ฐ ํฌ์žฅ
RepositoryJpaRepositoryDB CRUD ์ž๋™ ์ƒ์„ฑ
Service๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ทœ์น™๊ณผ ์ ˆ์ฐจ ๊ตฌํ˜„
ControllerREST API์š”์ฒญ-์‘๋‹ต ์ฒ˜๋ฆฌ
BCrypt๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ๋ณด์•ˆ ๊ฐ•ํ™”
PageableํŽ˜์ด์ง€๋„ค์ด์…˜๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ํšจ์œจ ์กฐํšŒ
profile
๐Ÿ—‚๏ธ hamstern

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