compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.2'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.2'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'
jwt.secret.key=7ZWt7ZW0OTntmZTsnbTtjIXtlZzqta3snYTrhIjrqLjshLjqs4TroZzrgpjslYTqsIDsnpDtm4zrpa3tlZzqsJzrsJzsnpDrpbzrp4zrk6TslrTqsIDsnpA=
@Slf4j
@Component
@RequiredArgsConstructor
public class JwtUtil {
/* 1. JWT Token μμ± νμκ° */
// Header Key κ°
public static final String AUTHORIZATION_HEADER = "Authorization";
// μ¬μ©μ κΆνκ° Key
public static final String AUTHORIZATION_KEY = "auth";
// JWT Token μΈμ¦λ°©μ (Bearer + JWT Token ν¨κ» μ μ‘)
private static final String BEARER_PREFIX = "Bearer ";
// JWT Token λ§λ£μκ°
private static final long TOKEN_TIME = 60 * 60 * 1000L; // msκΈ°μ€ -> 1μκ°
// application.properties -> JWT Secret Key λΆλ¬μ΄
@Value("${jwt.secret.key}")
private String secretKey;
// JWT Token μμ± λ° κ²μ¦ Key μ μ₯μ©λ
private Key key;
// JWT Token μμ±(μ¬μΈ)μκ³ λ¦¬μ¦
private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// Spring Bean μ΄κΈ°ν -> μ€νλλ λ©μλ
@PostConstruct
public void init() {
// secretKey -> λμ½λ© -> byteλ°°μ΄μ λ΄μ
byte[] bytes = Base64.getDecoder().decode(secretKey);
// λμ½λ© ν byteλ°°μ΄ -> JWT Token μλͺ
λ° κ²μ¦μ νμν key μμ±
key = Keys.hmacShaKeyFor(bytes);
}
/* 2. Client Request Header -> JWT Token κ°μ Έμ€κΈ° */
public String getToken(HttpServletRequest httpServletRequest) {
// Headerμ μλ JWT Token -> clientTokenμ λ΄μ
String clientToken = httpServletRequest.getHeader(AUTHORIZATION_HEADER);
// clientToken μ‘΄μ¬ + Bearerλ‘ μμ -> JWT Token κ°λ§ μΆμΆ
if (StringUtils.hasText(clientToken) && clientToken.startsWith(BEARER_PREFIX)) {
return clientToken.substring(7);
}
return null;
}
/* 3. JWT Token μμ± */
public String createToken(String username, UserRoleEnum userRoleEnum) {
Date date = new Date();
return BEARER_PREFIX +
Jwts.builder()
.setSubject(username)
.claim(AUTHORIZATION_KEY, userRoleEnum)
.setExpiration(new Date(date.getTime() + TOKEN_TIME))
.setIssuedAt(date)
.signWith(key, signatureAlgorithm)
.compact();
}
/* 4. JWT Token κ²μ¦ */
public boolean validateToken(String token) {
try {
Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
return true;
} catch (SecurityException | MalformedJwtException exception) {
log.info("Invalid JWT signature, μ ν¨νμ§ μλ JWT μλͺ
μ
λλ€");
} catch (ExpiredJwtException exception) {
log.info("Expired JWT Token, λ§λ£λ JWT Token μ
λλ€");
} catch (UnsupportedJwtException exception) {
log.info("Unsupported JWT Token, μ§μλμ§ μλ JWT Token μ
λλ€");
} catch (IllegalArgumentException exception) {
log.info("JWT claims is empty, μλͺ»λ JWT Token μ
λλ€");
}
return false;
}
/* 5. JWT Token -> νμμ 보 κ°μ Έμ€κΈ° */
public Claims getUserInfoFromToken(String token) {
return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
}
}
import org.springframework.beans.factory.annotation.Value;
β @Value importλ¬Έ μμ μ μ©λ‘κ·ΈμΈμ±κ³΅ β HTTP Response Headerμ JWT Token μμ± ν, μ€μ΄ Clientμκ² λ³΄λ
/* μλΆλΆ μλ΅ */
// λ‘κ·ΈμΈ
@ResponseBody
@PostMapping("/login")
public String login(@RequestBody LoginRequestDto loginRequestDto, HttpServletResponse httpServletResponse) {
userService.login(loginRequestDto, httpServletResponse);
return "success";
}
/* μλΆλΆ μλ΅ */
// λ‘κ·ΈμΈ
@Transactional(readOnly = true)
public void login(LoginRequestDto loginRequestDto, HttpServletResponse httpServletResponse) {
// 1. RequestDto -> ID/PW κ°μ Έμ΄
String username = loginRequestDto.getUsername();
String password = loginRequestDto.getPassword();
// 2. νμμ ν¨μ±κ²μ¬
User user = userRepository.findByUsername(username).orElseThrow(
() -> new IllegalArgumentException("λ±λ‘λ μ¬μ©μκ° μμ΅λλ€")
);
// 3. λΉλ°λ²νΈμ ν¨μ±κ²μ¬
if (! user.getPassword().equals(password)) {
throw new IllegalArgumentException("λΉλ°λ²νΈκ° μΌμΉνμ§ μμ΅λλ€");
}
// 4. λ‘κ·ΈμΈμ±κ³΅ -> Http Response Headerμ JWT Token 보λ΄κΈ°
httpServletResponse.addHeader(JwtUtil.AUTHORIZATION_HEADER, jwtUtil.createToken(user.getUsername(), user.getRole()));
}
π ProductController.java
/* μλΆλΆ μλ΅ */
// κ΄μ¬μν μ‘°ν
@GetMapping("/products")
public List<ProductResponseDto> getProducts(HttpServletRequest httpServletRequest) {
return productService.getProducts(httpServletRequest);
}
/* λ·λΆλΆ μλ΅ */
π ProductService.java
/* μλΆλΆ μλ΅ */
// κ΄μ¬μν μ‘°ν
@Transactional(readOnly = true)
public List<ProductResponseDto> getProducts(HttpServletRequest httpServletRequest) {
// 1. HTTP Request Header -> JWT Token κ°μ Έμ€κΈ°
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
// 2. JWT Token μλκ²½μ°μλ§ -> κ΄μ¬μν μ‘°ν κ°λ₯
if (token != null) {
// 2-1. JWT Token κ²μ¦
if (jwtUtil.validateToken(token)) {
// true -> Tokenμμ μ¬μ©μμ 보 κ°μ Έμ€κΈ°
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 2-2. Tokenμμ κ°μ Έμ¨ μ¬μ©μμ 보 -> DBμ‘°ν
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€")
);
// 2-3. μ¬μ©μκΆν ADMIN ; μ 체쑰ν, USER ; λ³ΈμΈ κ΄μ¬μνμ‘°ν
UserRoleEnum userRoleEnum = user.getRole();
System.out.println("role = " + userRoleEnum);
List<ProductResponseDto> productResponseDtoList = new ArrayList<>();
List<Product> productList;
if (userRoleEnum == UserRoleEnum.USER) {
productList = productRepository.findAllByUserId(user.getId());
} else {
productList = productRepository.findAll();
}
for (Product product : productList) {
productResponseDtoList.add(ProductResponseDto.of(product));
}
return productResponseDtoList;
} else {
return null;
}
}
/* λ·λΆλΆ μλ΅ */
π ProductController.java
/* μλΆλΆ μλ΅ */
// κ΄μ¬μν λ±λ‘
@PostMapping("/products")
public ProductResponseDto createProduct(@RequestBody ProductRequestDto productRequestDto, HttpServletRequest httpServletRequest) {
return productService.createProduct(productRequestDto, httpServletRequest);
}
/* λ·λΆλΆ μλ΅ */
π ProductService.java
/* μλΆλΆ μλ΅ */
// κ΄μ¬μν λ±λ‘
@Transactional
public ProductResponseDto createProduct(ProductRequestDto productRequestDto, HttpServletRequest httpServletRequest) {
// 1. HTTP Request Header -> JWT Token κ°μ Έμ€κΈ°
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
// 2. JWT Token μλκ²½μ°μλ§ -> κ΄μ¬μν λ±λ‘ κ°λ₯
if (token != null) {
// 2-1. JWT Token κ²μ¦
if (jwtUtil.validateToken(token)) {
// true -> Tokenμμ μ¬μ©μμ 보 κ°μ Έμ€κΈ°
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 2-2. Tokenμμ κ°μ Έμ¨ μ¬μ©μμ 보 -> DBμ‘°ν
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€")
);
// 2-3. μμ²λ°μ DTO -> DBμ μ μ₯ν κ°μ²΄μμ±
Product product = productRepository.saveAndFlush(Product.of(productRequestDto, user.getId()));
return ProductResponseDto.of(product);
} else {
return null;
}
}
/* λ·λΆλΆ μλ΅ */
π ProductController.java
/* μλΆλΆ μλ΅ */
@PutMapping("/products/{id}")
public Long updateProduct(@PathVariable Long id, @RequestBody ProductMypriceRequestDto productMypriceRequestDto, HttpServletRequest httpServletRequest) {
return productService.updateProduct(id, productMypriceRequestDto, httpServletRequest);
}
/* λ·λΆλΆ μλ΅ */
π ProductService.java
/* μλΆλΆ μλ΅ */
// κ΄μ¬μν μ΅μ κ° λ±λ‘
@Transactional
public Long updateProduct(Long id, ProductMypriceRequestDto productMypriceRequestDto, HttpServletRequest httpServletRequest) {
// 1. HTTP Request Header -> JWT Token κ°μ Έμ€κΈ°
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
// 2. JWT Token μλκ²½μ°μλ§ -> κ΄μ¬μν λ±λ‘ κ°λ₯
if (token != null) {
// 2-1. JWT Token κ²μ¦
if (jwtUtil.validateToken(token)) {
// true -> Tokenμμ μ¬μ©μμ 보 κ°μ Έμ€κΈ°
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 2-2. Tokenμμ κ°μ Έμ¨ μ¬μ©μμ 보 -> DBμ‘°ν
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€")
);
Product product = productRepository.findByIdAndUserId(id, user.getId()).orElseThrow(
() -> new IllegalArgumentException("ν΄λΉμνμ μ‘΄μ¬νμ§ μμ΅λλ€")
);
product.update(productMypriceRequestDto);
return product.getId();
} else {
return null;
}
}
/* λ·λΆλΆ μλ΅ */
κ΅¬λΆ | μ’ λ₯ |
---|---|
νμ΄μ§ | - page : μ‘°νν νμ΄μ§ λ²νΈ (1λΆν° μμ) - size : ν νμ΄μ§μ 보μ¬μ€ λ΄μ© κ°―μ (10κ°λ‘ κ³ μ ) |
μ λ ¬ | - sortBy (μ λ ¬νλͺ©) : id, title, lprice - isAsc (μ€λ¦μ°¨μ) : true β asc μ€λ¦μ°¨μ, false β desc λ΄λ¦Όμ°¨μ |
κΈ°λ₯ | Method | URL | Request | Response |
---|---|---|---|---|
λ©μΈνμ΄μ§ | GET | /api/shop | - | index.html |
Queryλ‘ μνκ²μ, μνκ²μκ²°κ³Ό λͺ©λ‘λ°ν | GET | /api/search?query=κ²μμ΄ | - | [ { Β Β "title" : String, Β Β "image" : String, Β Β "link" : String, Β Β "lprice" : int }, β’β’β’ ] |
κ΄μ¬μν λ±λ‘ | POST | /api/products | Header Authorization : Bearer <JWT> { Β Β "title" : String, Β Β "image" : String, Β Β "link" : String, Β Β "lprice" : int } | { Β Β "id" : Long, Β Β "title" : String, Β Β "image" : String, Β Β "link" : String, Β Β "lprice" : int, Β Β "myprice" : int } |
κ΄μ¬μν μ‘°ν | GET | /api/products?sortBy=String&isAsc=boolean&size=int&page=int | Header Authorization : Bearer <JWT> | Page<Product> |
κ΄μ¬μν μ΅μ κ° λ±λ‘ | PUT | /api/products/{id} | Header Authorization : Bearer <JWT> { Β Β "myprice" : int } | id |
/* μλΆλΆ μλ΅ */
// κ΄μ¬μν μ‘°ν
@GetMapping("/products")
public Page<Product> getProducts(
@RequestParam("page") int page, // μ‘°νν νμ΄μ§ λ²νΈ (1λΆν° μμ)
@RequestParam("size") int size, // ν νμ΄μ§μ 보μ¬μ€ κ°μ
@RequestParam("sortBy") String sortBy, // μ λ ¬νλͺ©
@RequestParam("isAsc") boolean isAsc, // μ€λ¦μ°¨μ(True), λ΄λ¦Όμ°¨μ(False)
HttpServletRequest httpServletRequest) {
return productService.getProducts(httpServletRequest, page-1, size, sortBy, isAsc);
}
/* λ·λΆλΆ μλ΅ */
/* μλΆλΆ μλ΅ */
// κ΄μ¬μν μ‘°ν
@Transactional(readOnly = true)
public Page<Product> getProducts(HttpServletRequest httpServletRequest,
int page, int size, String sortBy, boolean isAsc) {
// νμ΄μ§
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, sortBy);
Pageable pageable = PageRequest.of(page, size, sort);
// 1. HTTP Request Header -> JWT Token κ°μ Έμ€κΈ°
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
// 2. JWT Token μλκ²½μ°μλ§ -> κ΄μ¬μν μ‘°ν κ°λ₯
if (token != null) {
// 2-1. JWT Token κ²μ¦
if (jwtUtil.validateToken(token)) {
// true -> Tokenμμ μ¬μ©μμ 보 κ°μ Έμ€κΈ°
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 2-2. Tokenμμ κ°μ Έμ¨ μ¬μ©μμ 보 -> DBμ‘°ν
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€")
);
// 2-3. μ¬μ©μκΆν ADMIN ; μ 체쑰ν, USER ; λ³ΈμΈ κ΄μ¬μνμ‘°ν
UserRoleEnum userRoleEnum = user.getRole();
System.out.println("role = " + userRoleEnum);
Page<Product> productPage;
if (userRoleEnum == UserRoleEnum.USER) {
productPage = productRepository.findAllByUserId(user.getId(), pageable);
} else {
productPage = productRepository.findAll(pageable);
}
return productPage;
} else {
return null;
}
}
/* λ·λΆλΆ μλ΅ */
/* μλΆλΆ μλ΅ */
public interface ProductRepository extends JpaRepository<Product, Long> {
Page<Product> findAllByUserId(Long userId, Pageable pageable);
Optional<Product> findByIdAndUserId(Long id, Long userId);
Page<Product> findAll(Pageable pageable);
}
/* λ·λΆλΆ μλ΅ */
μꡬμ¬ν | κΈ°λ₯ |
---|---|
ν΄λ μμ± | - νμλ³ ν΄λ μΆκ° κ°λ₯ - ν΄λ μΆκ° μ, 1~Nκ° νλ²μ μΆκ° κ°λ₯ |
ν΄λμ κ΄μ¬μν μ½μ | - κ΄μ¬μνμ ν΄λ Nκ°μ λ€μ΄κ° μ μμ - κ΄μ¬μνμ΄ λ±λ‘λλ μμ β μ΄λ ν΄λμλ μ μ₯ β |
ν΄λ λ³ μ‘°ν | - νμμ ν΄λ λ³ κ΄μ¬μν μ‘°ν κ°λ₯ - μ 체 : ν΄λμ μκ΄μμ΄ νμμ΄ μ μ₯ν μ 체 κ΄μ¬μν μ‘°ν - ν΄λλͺ : ν΄λ λ³ μ μ₯λ κ΄μ¬μνλ§ μ‘°ν κ°λ₯ |
@OneToMany
public class User {
@OneToMany
private List<Folder> folderList;
}
// νμμ΄ κ°μ§ ν΄λ μ‘°ν
List<Folder> folderList = user.getFolderList();
@ManyToOne
public class Folder {
@ManyToOne
private User user;
}
// ν΄λ μμ νμ μ‘°ν
folder.getUser();
@ManyToOne
@JoinColumn(name = "USER_ID", nullable = false)
private User user;
// name : μΈλν€λͺ
// nullable : μΈλν€ null νμ©μ¬λΆ
κΈ°λ₯ | Method | URL | Request | Response |
---|---|---|---|---|
ν΄λ μμ± | POST | api/folders | { Β Β "folderNames" : [String, β’β’β’] } | [String, β’β’β’] |
ν΄λ μ‘°ν | GET | api/user-folder | - | index.html model μΆκ° β folders |
/* μλΆλΆ μλ΅ */
@OneToMany
List<Folder> folders = new ArrayList<>();
/* λ·λΆλΆ μλ΅ */
@Entity
@Getter
@NoArgsConstructor
public class Folder {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
private String name;
@ManyToOne
@JoinColumn(name = "USER_ID", nullable = false)
private User user;
// μμ±μ
public Folder(String name, User user) {
this.name = name;
this.user = user;
}
}
@Getter
public class FolderRequestDto {
List<String> folderNames;
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class FolderController {
private final FolderService folderService;
// ν΄λ μμ±
@PostMapping("/folders")
public List<Folder> addFolders(@RequestBody FolderRequestDto folderRequestDto, HttpServletRequest httpServletRequest) {
List<String> folderNames = folderRequestDto.getFolderNames();
return folderService.addFolders(folderNames, httpServletRequest);
}
}
@Service
@RequiredArgsConstructor
public class FolderService {
private final FolderRepository folderRepository;
private final UserRepository userRepository;
private final JwtUtil jwtUtil;
// ν΄λ μμ±
@Transactional
public List<Folder> addFolders(List<String> folderNames, HttpServletRequest httpServletRequest) {
// Client Request -> Token κ°μ Έμ€κΈ°
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
// Token μ ν¨ -> ν΄λμμ± κ°λ₯
if (token != null) {
// Token κ²μ¦
if (jwtUtil.validateToken(token)) {
// ν ν° -> μ¬μ©μ μ 보 κ°μ Έμ€κΈ°
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// ν ν°μμ κ°μ Έμ¨ μ¬μ©μ μ 보λ₯Ό μ¬μ©νμ¬ DB μ‘°ν
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€.")
);
List<Folder> folderList = new ArrayList<>();
for (String folderName : folderNames) {
Folder folder = new Folder(folderName, user);
folderList.add(folder);
}
return folderRepository.saveAll(folderList);
} else {
return null;
}
}
// ν΄λ μ‘°ν
public List<Folder> getFolders(HttpServletRequest httpServletRequest) {
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
if (token != null) {
if (jwtUtil.validateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// ν ν°μμ κ°μ Έμ¨ μ¬μ©μ μ 보λ₯Ό μ¬μ©νμ¬ DB μ‘°ν
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€.")
);
return folderRepository.findAllByUser(user);
} else {
return null;
}
}
}
public interface FolderRepository extends JpaRepository<Folder, Long> {
List<Folder> findAllByUser(User user);
}
@Controller
@RequiredArgsConstructor
@RequestMapping("/api")
public class ShopController {
private final FolderService folderService;
@GetMapping("/shop")
public ModelAndView shop() {
return new ModelAndView("index");
}
// λ‘κ·ΈμΈ ν μ μ -> λ©μΈνμ΄μ§ μμ² μ, ν΄λ μλ μ‘°ν
@GetMapping("/user-folder")
public String getUserInfo(Model model, HttpServletRequest httpServletRequest) {
model.addAttribute("folders", folderService.getFolders(httpServletRequest));
return "/index :: #fragment";
}
}
π Folderμ Product JPA μ°κ΄κ΄κ³ β‘οΈ
M : N
κ΄μ¬μν β ν΄λ 0 ~ Nκ° μ€μ κ°λ₯
κ΄μ¬μν λ±λ‘μμ β μ΄λ€ ν΄λμλ μ μ₯ β
κ΄μ¬μν β κΈ° μμ±λ ν΄λλ₯Ό μ νν΄ μΆκ°κ°λ₯
κΈ°λ₯ | Method | URL | Request | Response |
---|---|---|---|---|
ν΄λ μ 체 μ‘°ν | 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 |
/* μλΆλΆ μλ΅ */
// ν΄λ μ 체 μ‘°ν
@GetMapping("/folders")
public List<Folder> getFolders(HttpServletRequest httpServletRequest) {
return folderService.getFolders(httpServletRequest);
}
/* λ·λΆλΆ μλ΅ */
/* μλΆλΆ μλ΅ */
// κ΄μ¬μνμ ν΄λμΆκ°
@PostMapping("products/{productId}/folder")
public Long addFolder(@PathVariable Long productId, @RequestParam Long folderId, HttpServletRequest httpServletRequest) {
Product product = productService.addFolder(productId, folderId, httpServletRequest);
return product.getId();
}
/* μλΆλΆ μλ΅ */
// κ΄μ¬μνμ ν΄λμΆκ°
@Transactional
public Product addFolder(Long productId, Long folderId, HttpServletRequest httpServletRequest) {
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
if (token != null) {
if (jwtUtil.validateToken(token)) {
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// μ¬μ©μ μ ν¨μ±κ²μ¬
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€")
);
// μν μ ν¨μ±κ²μ¬
Product product = productRepository.findById(productId)
.orElseThrow( () -> new NullPointerException("ν΄λΉ μν μμ΄λκ° μ‘΄μ¬νμ§ μμ΅λλ€") );
// ν΄λ μ ν¨μ±κ²μ¬
Folder folder = folderRepository.findById(folderId)
.orElseThrow( () -> new NullPointerException("ν΄λΉ ν΄λ μμ΄λκ° μ‘΄μ¬νμ§ μμ΅λλ€") );
// μν, ν΄λ -> κ°μ νμ μμ μΈμ§ νμΈ
Long loginUserId = user.getId();
if (! product.getUserId().equals(loginUserId) || ! folder.getUser().getId().equals(loginUserId)) {
throw new IllegalArgumentException("νμλμ κ΄μ¬μνμ΄ μλκ±°λ, νμλμ ν΄λκ° μλλλ€");
}
product.addFolder(folder);
} else {
return null;
}
}
/* μλΆλΆ μλ΅ */
@ManyToMany
private List<Folder> folderList = new ArrayList<>();
/* μ€κ°λΆλΆ μλ΅ */
// κ΄μ¬μνμ ν΄λμΆκ°
public void addFolder(Folder folder) {
this.folderList.add(folder);
}
/* λ·λΆλΆ μλ΅ */
νμμ ν΄λ λ³ κ΄μ¬μν μ‘°νκ°λ₯
'ν΄λλ³' : ν΄λλ³ μ μ₯λ κ΄μ¬μν μ‘°νκ°λ₯
'μ 체' : ν΄λμ μκ΄μμ΄ νμμ΄ μ μ₯ν μ 체 κ΄μ¬μν μ‘°νκ°λ₯
κΈ°λ₯ | Method | URL | Request | Response |
---|---|---|---|---|
ν΄λ λ³ κ΄μ¬μν μ‘°ν | GET | api/folders/{folderId}/products | {folderId} : μ‘°νλ₯Ό μνλ ν΄λ Id | Page<Product> |
/* μλΆλΆ μλ΅ */
// ν΄λ λ³ κ΄μ¬μν μ‘°ν
@GetMapping("/folders/{folderId}/products")
public Page<Product> getProductsInFolder (@PathVariable Long folderId,
@RequestParam int page,
@RequestParam int size,
@RequestParam String sortBy,
@RequestParam boolean isAsc,
HttpServletRequest httpServletRequest) {
return folderService.getProductsInFolder(folderId, page-1, size, sortBy, isAsc, httpServletRequest);
}
/* μλΆλΆ μλ΅ */
@Transactional(readOnly = true)
public Page<Product> getProductsInFolder(Long folderId, int page, int size, String sortBy, boolean isAsc, HttpServletRequest httpServletRequest) {
// νμ΄μ§ μ²λ¦¬
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, sortBy);
Pageable pageable = PageRequest.of(page, size, sort);
// Requestμμ Token κ°μ Έμ€κΈ°
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
// ν ν°μ΄ μλ κ²½μ°μλ§ κ΄μ¬μν μ‘°ν κ°λ₯
if (token != null) {
// Token κ²μ¦
if (jwtUtil.validateToken(token)) {
// ν ν°μμ μ¬μ©μ μ 보 κ°μ Έμ€κΈ°
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// ν ν°μμ κ°μ Έμ¨ μ¬μ©μ μ 보λ₯Ό μ¬μ©νμ¬ DB μ‘°ν
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€.")
);
return productRepository.findAllByUserIdAndFolderList_Id(user.getId(), folderId, pageable);
} else {
return null;
}
public interface ProductRepository extends JpaRepository<Product, Long> {
Page<Product> findAllByUserIdAndFolderList_Id(Long userId, Long folderId, Pageable);
}
private boolean isExistFolderName(String folderName, List<Folder> existFolderList) {
// κΈ°μ‘΄ ν΄λ 리μ€νΈμμ folder name μ΄ μλμ§ κ²μ¬
for (Folder existFolder : existFolderList) {
if (existFolder.getName().equals(folderName)) {
return true;
}
}
return false;
}
/* ν΄λμμ± addFolders λ©μλ */
// ν΄λλͺ
μ€λ³΅κ²μ¬
List<Folder> existFolderList = folderRepository.findAllByUserAndNameIn(user, folderNames);
List<Folder> folderList = new ArrayList<>();
for (String folderName : folderNames) {
if (! isExistFolderName(folderName, existFolderList)) {
Folder folder = new Folder(folderName, user);
folderList.add(folder);
}
}
return folderRepository.saveAll(folderList);
/* μλΆλΆ μλ΅ */
List<Folder> findAllByUserAndNameIn(User user, List<String> names);
/* κ΄μ¬μνμ ν΄λμΆκ° addFolder λ©μλ */
// μ€λ³΅νμΈ
Optional<Product> overlapFolder = productRepository.findbyIdAndFolderList_Id(product.getId(), folder.getId());
if (overlapFolder.isPresent()) {
throw new IllegalArgumentException("μ€λ³΅λ ν΄λμ
λλ€");
}
product.addFolder(folder);
/* μλΆλΆ μλ΅ */
Optional<Product> findByIdAndFolderList_Id(Long productId, Long folderId);
λ‘κ·ΈμΈ ν Userκ° λ©μΈνμ΄μ§ μμ² μ, μ μ μ μ΄λ¦ λ°ν
ShopController.java
@GetMapping("/user-info")
@ResponseBody
public String getUserName(HttpServletRequest httpServletRequest) {
String token = jwtUtil.getToken(httpServletRequest);
Claims claims;
if (token != null) {
// Token κ²μ¦
if (jwtUtil.validateToken(token)) {
// ν ν°μμ μ¬μ©μ μ 보 κ°μ Έμ€κΈ°
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// ν ν°μμ κ°μ Έμ¨ μ¬μ©μ μ 보λ₯Ό μ¬μ©νμ¬ DB μ‘°ν
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("μ¬μ©μκ° μ‘΄μ¬νμ§ μμ΅λλ€.")
);
return user.getUsername();
}else {
return "fail";
}
}