Spring Framework

Lombok, DTO

na_o 2021. 7. 18. 17:59
728x90

- Lombok

Getter, Setter 등 필수적으로 필요한 메소드들을 어노테이션으로 자동 생성해줘서

코드의 길이를 줄일 수 있도록 도와주는 라이브러리

 

- @Getter, @NoArgsConstrucctor 적용

@Getter :

    Getter 함수를 대신함

    public void getTutor() {

       return this.tutor;

    }

    등 Getter함수들을 적을 필요 없음

@NoArgsConstructor :

    기본생성자를 대신 생성

    public Course() {   

   

    }

    를 기재 안 해도 됨

/*Course.java*/

@Getter //getter함수를 대신함(lombok)
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.(lombok)
@Entity
public class Course extends Timestamped {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String tutor;

    public Course(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }

    public void update(Course course) {
        this.title = course.title;
        this.tutor = course.tutor;
    }

}

 

- @RequiredArgsConstructor 적용

@RequiredArgsConstructor :

    생성자를 대신해서 Repository를 대신 넣어줌

    public CourseService(CourseRepository courseRepository) {

        this.courseRepository = courseRepository;

    }

    위의 기능을 어노테이션이 대신 함

/*CourseService.java*/

@Service
@RequiredArgsConstructor //생성자를 대신해서 Repository를 대신 넣어줌
public class CourseService {

    private final CourseRepository courseRepository;

    @Transactional
    public Long update(Long id, Course course) {
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        course1.update(course);
        return course1.getId();
    }
}

 

- DTO(Data Transfer Object)

update나 delete 시 데이터를 옮겨다니는데 도중 데이터가 바뀌면 큰 일 나기 때문에

완충재 역할을 하는 것

DTO의 멤버변수에 final로 선언해서 데이터를 못 바꾸게 방지함

/*CourseRequestDto.java*/

package com.sparta.week02.domain;

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

@Setter
@Getter
@RequiredArgsConstructor
public class CourseRequestDto {
    private final String title;
    private final String tutor;
}

- update 메소드에서 쓰였던 Course 클래스를 CourseRequestDto 클래스로 변경

/*CourseService.java*/

@Service
@RequiredArgsConstructor //생성자를 대신해서 Repository를 대신 넣어줌
public class CourseService {

    private final CourseRepository courseRepository;

    @Transactional
    public Long update(Long id, CourseRequestDto requestDto) {
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        course1.update(requestDto);
        return course1.getId();
    }
}

- Course 클래스의 update 메소드의 매개변수를 CourseRequestDto로 변경

/*Course.java*/

@Getter //getter함수를 대신함(lombok)
@NoArgsConstructor // 기본생성자를 대신 생성해줍니다.(lombok)
@Entity
public class Course extends Timestamped {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String tutor;

    public Course(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }

    public void update(CourseRequestDto requestDto) {
        this.title = requestDto.getTitle();
        this.tutor = requestDto.getTutor();
    }

}

- Course 생성자를 CourseRequestDto로 바꾸고 main함수에 있는 update 함수의 매개변수 변경

/*Week02Application.java*/

@EnableJpaAuditing
@SpringBootApplication
public class Week02Application {

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

    @Bean
    public CommandLineRunner demo(CourseRepository courseRepository, CourseService courseService) {
        return (args) -> {
            courseRepository.save(new Course("프론트엔드의 꽃, 리액트", "임민영"));

            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.getTutor());
            }

            CourseRequestDto requestDto = new CourseRequestDto("웹개발의 봄, Spring", "임민영");
            courseService.update(1L, requestDto);
            courseList = courseRepository.findAll();
            for (int i=0; i<courseList.size(); i++) {
                Course course = courseList.get(i);
                System.out.println("id: " + course.getId() +
                              "/ title: " + course.getTitle() +
                              "/ tutor: " + course.getTutor());
            }

            courseRepository.deleteAll();
        };
    }
}

 

실행 결과

'Spring Framework' 카테고리의 다른 글

API - POST, PUT, DELETE  (0) 2021.07.21
API-GET  (0) 2021.07.18
JPA) JPA 심화  (0) 2021.07.14
JPA) 생성일자, 수정일자  (0) 2021.07.11
JPA) JPA 사용해보기  (0) 2021.07.11