인증(Authentication) : 사용자 신원을 확인하는 행위
인가(Authorization) : 사용자 권한을 확인하는 행위
인증 : 로그인을 통해 본인임을 확인(주로 아이디,패스워드 이용)
인가 : 주고 역할에 따른 사용 권한 관리(회원 등급에 따라)
회원관리 기능 설계
기능 | Method | URL | Request | Response |
---|---|---|---|---|
회원 가입 | GET | /user/signup | - | 회원 가입 html |
POST | /user/signup | 회원 가입에 필요한 정보 | - | |
회원 로그인 | GET | /user/login/ | - | 회원 로그인 html |
POST | /user/login/ | 아이디, 패워 | - | |
회원 로그아웃 | GET | /user/logout | - | - |
상품 등록 및 조회 API 설계
기능 | Method | URL | 설명 |
---|---|---|---|
상품 등록(회원별) | POST | /api/products | 로그인 되어있는 회원별로 상품 등록 |
상품 조회(회원별) | GET | /api/products/ | 로그인 되어있는 회원이 등록한 상품만 조회 |
상품 조회(관리자) | GET | /api/admin/products/ | 모든 회원의 상품 조회 |
DB에 저장할 회원정보 Entity 설계
테이블 ID | ID | long
로그인한 회원정보 함께 저장
# 기존 ProductController
// 신규 상품 등록
@PostMapping("/api/products")
public Product createProduct(@RequestBody ProductRequestDto requestDto) {
Product product = productService.createProduct(requestDto);
return product; // 응답 보내기
}
# 로그인 정보 담음
// 신규 상품 등록
@PostMapping("/api/products")
public Product createProduct(@RequestBody ProductRequestDto requestDto,
@AuthenticationPrincipal UserDetailsImpl userDetails) {
Long userId = userDetails.getUser().getId(); // 로그인 되어 있는 ID
Product product = productService.createProduct(requestDto, userId);
return product; // 응답 보내기
}
# 기존 ProductService
@Transactional // 메소드 동작이 SQL 쿼리문임을 선언
public Product createProduct(ProductRequestDto requestDto){
Product product = new Product(requestDto); // 요청받은 DTO 로 DB에 저장할 객체 만들기
productRepository.save(product);
return product;
# 로그인 정보 담음
@Transactional // 메소드 동작이 SQL 쿼리문임을 선언합니다.
public Product createProduct(ProductRequestDto requestDto, Long userId ) {
// 요청받은 DTO 로 DB에 저장할 객체 만들기
Product product = new Product(requestDto, userId);
productRepository.save(product);
return product;
}
# 기존 Product에 추가
@Column(nullable = false)
private Long userId;
// 생성자에도 추가
# 기존 ProductController
// 등록된 전체 상품 목록 조회
@GetMapping("/api/products")
public List<Product> getProducts() {
List<Product> products = productService.getProducts();
// 응답 보내기
return products;
}
# 로그인 정보
// 로그인한 회원이 등록한 상품들 조회
@GetMapping("/api/products")
public List<Product> getProducts(@AuthenticationPrincipal UserDetailsImpl userDetails) {
Long userId = userDetails.getUser().getId();
return productService.getProducts(userId);
}
# 기존 ProductService
public List<Product> getProducts() {
return productRepository.findAll();
}
# 로그인 정보
// 회원 ID 로 등록된 모든 상품 조회
public List<Product> getProducts(Long userId) {
return productRepository.findAllByUserId(userId);
}
# 기존 ProductRepository
public interface ProductRepository extends JpaRepository<Product, Long> {}
# 로그인정보 담아서
public interface ProductRepository extends JpaRepository<Product, Long> {
List<Product> findAllByUserId(Long userId);
}
2-10강 16분 30초