Spring(기초)-4주차-3

Jonguk Kim·2021년 11월 18일
0

Spring

목록 보기
10/16

1. 관심 상품 등록하기

  • 상품을 검색한 후, 등록 버튼을 눌렀을 때 관심 상품이 생성
    (검색 결과에서 제목, 이미지, 링크, 최저가 필요)
  • models 패키지 (src > main > java > com.sparta.week04 > models)

ProductRequestDto 클래스 만들기

  1. 멤버 변수 선언 (제목, 링크, 이미지, 최저가)
package com.sparta.week04.models;

public class ProductRequestDto {
    private String title;
    private String link;
    private String image;
    private int lprice;
}
  1. getter 메소드 자동 생성: 각각을 꺼낼 수 있도록 설정
@Getter	// 2. Getter 
public class ProductRequestDto {
    private String title;
    private String link;
    private String image;
    private int lprice;
}

ProductMypriceRequestDto 클래스 만들기

  1. 멤버 변수 선언 (관심가격)
public class ProductMypriceRequestDto {
    private int myprice;
}
  1. getter 메소드 자동 생성: 꺼내서 쓸수 있도록 설정
package com.sparta.week04.models;

import lombok.Getter;

@Getter // 2. Getter 
public class ProductMypriceRequestDto {
    private int myprice;
}

Product 클래스 개선하기

  • models 패키지 (src > main > java > com.sparta.week04 > models)
  1. Product 클래스 생성자 생성: 관심상품 정보를 가지고 있는 ProductRequestDto 전달
  2. 관심가격 not null이므로 0으로 설정: 관심가격 > 가격이면 나오도록 설정, 가장 적은 0으로 설정
package com.sparta.week04.models;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter // get 함수를 일괄적으로 만들어줍니다.
@NoArgsConstructor // 기본 생성자를 만들어줍니다.
@Entity // DB 테이블 역할을 합니다.
public class Product extends Timestamped{

    // ID가 자동으로 생성 및 증가합니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    // 반드시 값을 가지도록 합니다.
    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String image;

    @Column(nullable = false)
    private String link;

    @Column(nullable = false)
    private int lprice;

    @Column(nullable = false)
    private int myprice;

    ////////// 추가 ////////// 
    public Product(ProductRequestDto productRequestDto){	// 1. Product 클래스 생성자 생성
        this.title = productRequestDto.getTitle();
        this.link = productRequestDto.getLink();
        this.image = productRequestDto.getImage();
        this.lprice = productRequestDto.getLprice();
        this.myprice = 0;	// 2. 관심가격 not null이므로 0으로 설정
    }
    ////////////////////////
}

ProductService 만들기

  • service 패키지 (src > main > java > com.sparta.week04 > service)
  1. update 메소드 생성: ID, 관심가격 productMypriceRequestDto 사용하여 수정
  2. 서비스임을 선언
@Service // 2. 서비스임을 선언합니다.
public class ProductService {
	
    // 1. update 메소드 생성
    public Long update(Long id, ProductMypriceRequestDto requestDto) {
        
    }
}
  1. Repository 선언: Repository 사용해서 ID 찾음
  2. final 추가: 반드시 사용하도록, RequiredArgsConstructor: final로 선언된 멤버 변수를 자동으로 생성
package com.sparta.week04.service;

import com.sparta.week04.models.ProductMypriceRequestDto;
import com.sparta.week04.models.ProductRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@RequiredArgsConstructor	// 4. // final로 선언된 멤버 변수를 자동으로 생성
@Service
public class ProductService {

        private final ProductRepository productRepository;	// 3. Repository 선언
        
    public Long update(Long id, ProductMypriceRequestDto mypriceRequestDto){
        
    }
}
  1. ID 찾아서 product update
  2. 메소드 동작이 SQL 쿼리문임을 선언: DB정보 update해줘야 함
@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@Service // 서비스임을 선언합니다.
public class ProductService {

    private final ProductRepository productRepository;

    @Transactional // 6. 메소드 동작이 SQL 쿼리문임을 선언합니다.
    public Long update(Long id, ProductMypriceRequestDto requestDto) {
        Product product = productRepository.findById(id).orElseThrow(
                () -> new NullPointerException("해당 아이디가 존재하지 않습니다.")
        );
        product.update(requestDto);	// 5. update
        return id;
    }
}
  1. Product 클래스 개선 (관심 가격 변경)
package com.sparta.week04.models;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter // get 함수를 일괄적으로 만들어줍니다.
@NoArgsConstructor // 기본 생성자를 만들어줍니다.
@Entity // DB 테이블 역할을 합니다.
public class Product extends Timestamped{

    // ID가 자동으로 생성 및 증가합니다.
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;

    // 반드시 값을 가지도록 합니다.
    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String image;

    @Column(nullable = false)
    private String link;

    @Column(nullable = false)
    private int lprice;

    @Column(nullable = false)
    private int myprice;

    public Product(ProductRequestDto productRequestDto){
        this.title = productRequestDto.getTitle();
        this.link = productRequestDto.getLink();
        this.image = productRequestDto.getImage();
        this.lprice = productRequestDto.getLprice();
        this.myprice = 0;
    }

    ////////// 추가 //////////
    // 7. 관심 가격 변경 시 이용합니다.
    public void update(ProductMypriceRequestDto requestDto){
        this.myprice = requestDto.getMyprice();
    }
    ////////////////////////
}

ProductRestController 개선하기

  1. PostMapping 설정 (/api/products)
  2. productRepository 저장하는 기능 설정
  3. requestDto를 전달하여 Product 생성자 생성
package com.sparta.week04.models;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductRestController {

    private final ProductRepository productRepository;

    // 등록된 전체 상품 목록 조회
    @GetMapping("/api/products")
    public List<Product> getProducts() {
        return productRepository.findAll();
    }

    ////////// 추가 //////////
    // 신규 상품 등록
    @PostMapping("/api/products")	// 1. PostMapping 설정
    public Product createProduct(@RequestBody ProductRequestDto requestDto) {
        Product product = new Product(requestDto);	// 3. requestDto를 전달하여 Product 생성자 생성
        productRepository.save(product);	// 2. productRepository 저장하는 기능 설정
        return product;
    }
    ////////////////////////
}
profile
개발일지

0개의 댓글