본문 바로가기

카테고리 없음

DTO

DTO

테이블을 아무나 가져다 사용해도 되는가?

= read, update할 때 Course 클래스를 막 써도 될까?

= 내가 아닌 다른 사람이 변경이라도 한다면?? no!!

 

완충재로 활용하는 것이 바로 DTO(Data Transfer Object)

 

src > main > java > com.sparta.week02 > models 에 CourseRequestDto 파일 생성

 

package com.sparta.week02_hwk.domain;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Setter
@Getter
@RequiredArgsConstructor//final 변수때문에 필수
public class CourseRequestDto {
    private final String title;
    private final String Name;
    // final 로 선언하려면 해당 변수를 포함하는 생성자도 필요하다.
    // @RequiredArgsConstructor
}

 

자 DTO를 만들었으니 main메서드에서 기존에 호출 할 때마다 new Course 로 인스턴스를 생성하던걸 대체해준다.

package com.sparta.week02_hwk;

import com.sparta.week02_hwk.domain.Course;
import com.sparta.week02_hwk.domain.CourseRepository;
import com.sparta.week02_hwk.domain.CourseRequestDto;
import com.sparta.week02_hwk.service.CourseService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import java.util.List;

@EnableJpaAuditing// 생성, 수정에 따움 자동 업데이트 적용
@SpringBootApplication
public class Week02HwkApplication {

    public static void main(String[] args) {
        SpringApplication.run(Week02HwkApplication.class, args);
    }

    // Week02Application.java 의 main 함수 아래에 붙여주세요.
    @Bean
    public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
        return (args) -> {
            courseRepository.save(new Course("자바스크립트의 꽃, React", "홍유찬"));//저장

            System.out.println("데이터 인쇄");
            List<Course> courseList = courseRepository.findAll();//조회
            for (int i=0; i<courseList.size(); i++) {
                Course course = courseList.get(i);
                System.out.println(course.getId());
                System.out.println(course.getTitle());
                System.out.println(course.getName());
            }

            //Course new_course = new Course("자바의 봄, Spring", "홍유찬"); //Dto의 사용
            CourseRequestDto requestDto = new CourseRequestDto("자바의 봄, Spring", "홍유찬");
            //courseService.update(1L, new_course);//업데이트  //Dto의 사용
            courseService.update(1L, requestDto);
            courseList = courseRepository.findAll();
            for (int i=0; i<courseList.size(); i++) {
                Course course = courseList.get(i);
                System.out.println(course.getId());
                System.out.println(course.getTitle());
                System.out.println(course.getName());
            }
            //courseRepository.deleteById(1L); //deleteAll();

            Course course = courseRepository.findById(1L).orElseThrow(
                    () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다."));
        };
    }
}

 

대체 하고나면 CourseRequestDto가 인식이 안된다. service 단에서 업데이트를 Course로 받아오고 있기 때문이다.

update에서 매개변수 타입을 Couse에서  CourseRequestDto로 변경한다.

CourseService.java

package com.sparta.week02_hwk.service;

import com.sparta.week02_hwk.domain.Course;
import com.sparta.week02_hwk.domain.CourseRepository;
import com.sparta.week02_hwk.domain.CourseRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@RequiredArgsConstructor    //final 멤버변수를 고려한 생성자를 자동으로 만들어 줍니다.
@Service // 스프링에게 이 클래스는 서비스임을 명시
public class CourseService {

    // final: 서비스에게 꼭 필요한 녀석임을 명시, 변형 불가.
    private final CourseRepository courseRepository;

    // 생성자를 통해, Service 클래스를 만들 때 꼭 Repository를 넣어주도록
    // 스프링에게 알려줌
//    public CourseService(CourseRepository courseRepository) {
//        this.courseRepository = courseRepository;
//    } //@RequiredArgsConstructor  로 대체

    @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
    //public Long update(Long id, Course course) {  //Dto의 사용
    public Long update(Long id, CourseRequestDto requestDto) {
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        //course1.update(course);  //Dto의 사용
        course1.update(requestDto);
        return course1.getId();
    }
}

 

하고나면 또 CourseRequestDto에서 빨간줄이 나온다 왜나하면 DTO 에서 Course 의 멤버 변수를 받아오지 못하고 있기 떄문! 

Course.java에 선언된 멤버변수를 update메서드를 통해 DTO의 멤버변수로 받아오자

 

package com.sparta.week02_hwk.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;

@Getter
@Setter
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.
@Entity // 테이블임을 나타냅니다.
public class Course extends Timestamped {

    @Id // ID 값, Primary Key로 사용하겠다는 뜻입니다.
    @GeneratedValue(strategy = GenerationType.AUTO) // 자동 증가 명령입니다.
    private Long id;

    @Column(nullable = false) // 컬럼 값이고 반드시 값이 존재해야 함을 나타냅니다.
    private String title;

    @Column(nullable = false)
    private String name;

//    public Long getId() {
//        return this.id;
//    }
//
//    public String getTitle() {
//        return this.title;
//    }
//
//    public String getName() {
//        return this.name;
//    }
//    public Course() {
//    }
    public Course(String title, String name) {
        this.title = title;
        this.name = name;
    }

//    public void update(Course course) {
//        this.title = course.title;
//        this.name = course.name;
//    }
    public void update(CourseRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.name = requestDto.getName();
    }
}

끝