λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

SpringπŸƒ

μŠ€ν”„λ§ μˆ™λ ¨ : Project MySelectShop (3)

728x90

좜처 : 내일배움캠프

 

JPA

μΆ”κ°€ν•˜λŠ” κΈ°λŠ₯

  1. κ΄€μ‹¬μƒν’ˆ λͺ©λ‘ νŽ˜μ΄μ§• 및 μ •λ ¬ κ°€λŠ₯
  2. 폴더 생성 및 쑰회 κ°€λŠ₯
  3. κ΄€μ‹¬μƒν’ˆμ— 폴더 μΆ”κ°€ κΈ°λŠ₯
  4. 폴더 별 κ΄€μ‹¬μƒν’ˆ 쑰회 κ°€λŠ₯

νŽ˜μ΄μ§• κΈ°λŠ₯ : Springframwork.data.domain Page κ΅¬ν˜„μ²΄

κΈ°λŠ₯ λ©”μ„œλ“œ URL μš”μ²­ 응닡
λ©”μΈνŽ˜μ΄μ§€ GET /api/shop   index.html
ν‚€μ›Œλ“œλ‘œ μƒν’ˆ κ²€μƒ‰ν•˜κ³  κ²°κ³Όλ₯Ό λͺ©λ‘μœΌλ‘œ ν‘œμ‹œ GET /api/search?query=검색어   [
{
"title" : String,
"link" : String,
”image” : String,
"lprice" : int
},
…]
κ΄€μ‹¬μƒν’ˆ 등둝 POST /api/products Header
Authorization : Bearer <JWT>
{
"title" : String,
"image" : String,
"link" : String,
"lprice" : int
}
{
”id” : Long
"title" : String,
"link" : String,
”image” : String,
"lprice" : int,
"myprice" : int
}
κ΄€μ‹¬μƒν’ˆ 쑰회 GET /api/products?
sortBy=String&isAsc=boolean&size=int&page=int
Header
Authorization : Bearer <JWT>
Page<Product>
-> νŽ˜μ΄μ§•
(Dto λ°˜ν™˜λ„ κ°€λŠ₯
: λ³΅μž‘ν•¨)
κ΄€μ‹¬μƒν’ˆ μ΅œμ €κ°€ 등둝 PUT /api/products/{id} Header
Authorization :Bearer <JWT>
{
"myprice" : int,
}
id

 

폴더 섀계

-> 폴더 λ³„λ‘œ κ΄€μ‹¬μƒν’ˆμ„ μ €μž₯/관리할 수 μžˆλŠ” κΈ°λŠ₯ μΆ”κ°€

 

μš”κ΅¬μ‚¬ν•­

  1. νšŒμ›λ³„ 폴더λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.
  2. 폴더λ₯Ό μΆ”κ°€ν•  λ•Œ 1개~N개λ₯Ό ν•œλ²ˆμ— μΆ”κ°€ν•  수 μžˆλ‹€.

κ΄€μ‹¬μƒν’ˆμ— 폴더 μ„€μ •

  1. κ΄€μ‹¬μƒν’ˆμ— ν΄λ”λŠ” N개 μ„€μ •ν•  수 μžˆλ‹€.
  2. κ΄€μ‹¬μƒν’ˆμ΄ λ“±λ‘λ˜λŠ” μ‹œμ μ—λŠ” μ–΄λŠ 폴더에도 μ €μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.
  3. κ΄€μ‹¬μƒν’ˆ λ³„λ‘œ 1λ²ˆμ—μ„œ μƒμ„±ν•œ 폴더λ₯Ό μ„ νƒν•˜μ—¬ μΆ”κ°€ν•  수 μžˆλ‹€.

폴더별 쑰회

  1. νšŒμ›μ€ 폴더 λ³„λ‘œ κ΄€μ‹¬μƒν’ˆ μ‘°νšŒκ°€ κ°€λŠ₯ν•˜λ‹€.
  2. 쑰회 방법

'전체' 클릭 μ‹œ: 폴더와 상관 없이 νšŒμ›μ΄ μ €μž₯ν•œ 전체 κ΄€μ‹¬μƒν’ˆλ“€μ„ 쑰회 κ°€λŠ₯ν•˜λ‹€.

'폴더λͺ…' 클릭 μ‹œ: 폴더별 μ €μž₯된 κ΄€μ‹¬μƒν’ˆλ“€μ„ 쑰회 κ°€λŠ₯ν•˜λ‹€.

폴더 ν…Œμ΄λΈ” 섀계

  1. 폴더λͺ…: νšŒμ›μ΄ λ“±λ‘ν•œ 폴더 이름을 μ €μž₯
  2. νšŒμ›ID: 폴더λ₯Ό λ“±λ‘ν•œ νšŒμ›μ˜ ID λ₯Ό μ €μž₯
    • A νšŒμ›μ΄ μƒμ„±ν•œ ν΄λ”λŠ” A νšŒμ›μ—κ²Œλ§Œ 보여야 함
    • νšŒμ›κ³Ό ν΄λ”μ˜ 관계
      • 'νšŒμ›κ³Ό 폴더'의 κ΄€κ³„λŠ” 'νšŒμ›κ³Ό κ΄€μ‹¬μƒν’ˆ' 관계와 동일

κΈ°μ‘΄ 관계섀정 λ°©λ²•μœΌλ‘œλŠ” User μ—”ν‹°ν‹°μ˜ Idκ°€ Folder μ—”ν‹°ν‹°μ˜ UserID인지 λ°”λ‘œ μ•Œ 수 μ—†λ‹€.

@Entity
public class Folder {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

		@Column(nullable = false)
		private String name;

    @Column(nullable = false)
    private Long userId;
}

Folder 엔티티와 DBμ—μ„œ νšŒμ›κ³Ό μƒν’ˆμ˜ 관계λ₯Ό μ•Œ 수 μ—†λ‹€.

νšŒμ› -> 폴더 쑰회

- νšŒμ›λ³„ 쑰회 

// 1. λ‘œκ·ΈμΈν•œ νšŒμ› (user1) 의 id λ₯Ό 쑰회
Long userId = user1.getId();
// 2. userId 둜 μ €μž₯된 λͺ¨λ“  folder 쑰회
List<Folder> folders = folderRepository.findAllByUserId(userId);

폴더 -> νšŒμ› 쑰회

// 1. folder1 의 userId λ₯Ό 쑰회
Long userId = folder1.getUserId();
// 2. userId 둜 μ €μž₯된 νšŒμ› 쑰회
User user = userRepository.findById(userId);

=> μ–‘λ°©ν–₯ 연관관계 μ„€μ •!

User μ—”ν‹°ν‹° : @OneToMany

public class User {
    @OneToMany
    private List<Folder> folders;
}

Folder μ—”ν‹°ν‹° :@ManyToOne

public class Folder{
    @ManyToOne
    private User user;
}

 

ν΄λ”μ˜ 생성 및 쑰회 κ΅¬ν˜„

  1. νšŒμ›λ³„ 폴더λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.
  2. 폴더λ₯Ό μΆ”κ°€ν•  λ•Œ 1개~N개λ₯Ό ν•œλ²ˆμ— μΆ”κ°€ν•  수 μžˆλ‹€.
κΈ°λŠ₯ λ©”μ„œλ“œ 및 URL μš”μ²­ 응닡
폴더 생성 POST, /api/folders {
folderNames:
[String, ...]
}
[String...]
폴더 쑰회 GET, /api/user-folder   index.html
model μΆ”κ°€ -> folders

 

폴더 λ³„λ‘œ κ΄€μ‹¬μƒν’ˆμ„ λ‹΄λŠ” κΈ°λŠ₯

  1. κ΄€μ‹¬μƒν’ˆμ— 폴더λ₯Ό 0개 ~ N개 μ„€μ •ν•  수 μžˆλ‹€.
  2. κ΄€μ‹¬μƒν’ˆμ΄ λ“±λ‘λ˜λŠ” μ‹œμ μ—λŠ” μ–΄λŠ 폴더에도 μ €μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.
  3. κ΄€μ‹¬μƒν’ˆ λ³„λ‘œ κΈ° 생성 ν–ˆλ˜ 폴더λ₯Ό μ„ νƒν•˜μ—¬ μΆ”κ°€ν•  수 μžˆλ‹€.
  • 폴더와 μƒν’ˆμ˜ μ—°κ΄€ κ΄€κ³„λŠ”?
    • μƒν’ˆ 1κ°œμ— μ—¬λŸ¬κ°œμ˜ 폴더 μ €μž₯ κ°€λŠ₯
    • 폴더 1κ°œμ— μ—¬λŸ¬κ°œμ˜ μƒν’ˆ μ €μž₯ κ°€λŠ₯
    • 결둠적으둜
      • μƒν’ˆ : 폴더 = N : N
κΈ°λŠ₯ λ©”μ„œλ“œ, URL μš”μ²­ 응닡
폴더 전체 쑰회 GET, /api/folders   [
{
id : int,
name : String,
user :
         {
           id : int,
           username : String,
           password : String,
           email : String,
           role : String,
           folders : []
          }
}
…]
κ΄€μ‹¬μƒν’ˆμ„ 폴더에 λ‹΄κΈ° POST, /api/products/{productId}/folder {productId] : κ΄€μ‹¬μƒν’ˆ ID

[Form ν˜•νƒœ]
folderId : μΆ”κ°€ν•  폴더 ID
폴더가 μΆ”κ°€λœ κ΄€μ‹¬μƒν’ˆ ID

 

폴더별 κ΄€μ‹¬μƒν’ˆ 쑰회 κ΅¬ν˜„

  1. νšŒμ›μ€ 폴더 λ³„λ‘œ κ΄€μ‹¬μƒν’ˆ μ‘°νšŒκ°€ κ°€λŠ₯ν•˜λ‹€.
  2. 쑰회 방법
    1. '폴더별': 폴더별 μ €μž₯된 κ΄€μ‹¬μƒν’ˆλ“€μ„ 쑰회 κ°€λŠ₯ν•˜λ‹€.
    2. '전체': 폴더와 상관 없이 νšŒμ›μ΄ μ €μž₯ν•œ 전체 κ΄€μ‹¬μƒν’ˆλ“€μ„ 쑰회 κ°€λŠ₯ν•˜λ‹€.
κΈ°λŠ₯ λ©”μ„œλ“œ, URL μš”μ²­ 응닡
폴더별 κ΄€μ‹¬μƒν’ˆ 쑰회 GET, /api/folders/{folderId}/products {folderId} :쑰회λ₯Ό μ›ν•˜λŠ” 폴더 id Page<Product>

 

폴더 쀑볡 생성 λ°©μ§€ν•˜κΈ°

  1. 쀑볡 폴더λͺ… 생성 이슈
    1. 문제점: ν˜„μž¬ 폴더λͺ…이 μ€‘λ³΅ν•΄μ„œ μƒμ„±λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€!
    2. 해결방법: 생성할 폴더λͺ…이 μž…λ ₯으둜 듀어왔을 λ•Œ, DB 에 동일 폴더λͺ…이 μ—†λŠ” κ²½μš°μ—λ§Œ 생성
    3. μˆ˜μ •ν•  파일
      1. FolderService.java
      2. FolderRepository.java

+ μ‹€μŠ΅ : 같은 폴더 λ‚΄ κ΄€μ‹¬μƒν’ˆ 쀑볡 등둝 방지

  1. 같은 폴더 내에 μƒν’ˆ 쀑볡 생성 이슈
    1. 문제점: ν˜„μž¬ 같은 폴더내에 μƒν’ˆμ΄ 쀑볡 μƒμ„±λœλ‹€.
    2. 해결방법: μƒν’ˆμ— 폴더λ₯Ό 등둝할 λ•Œ 기쑴에 λ“±λ‘λœ 폴더인지 ν™•μΈν•œλ‹€.
    3. μˆ˜μ •ν•  파일
      1. ProductService.java
      2. ProductRepository.java
728x90