국비학원 41일차 : Spring Boot_3

Digeut·2023년 4월 21일
0

국비학원

목록 보기
35/44

DTO

데이터를 단순화하고, 가볍고, 직렬화할 수 있으며, 비즈니스 로직을 포함하지 않은 데이터 컨테이너이다. 이는 객체지향 프로그래밍에서 객체 간의 결합도를 낮춰 객체간의 의존성을 감소시키고, 코드의 재사용성을 높일 수 있으며, 유지보수를 편하게 해준다.

이때 각 필드에 해당하는 Constructor나 Setter, Getter 메서드 등이 필요한데 이러한 기본 메서드의 생성을 도와주는 것이 Lombok 라이브러리 이다.

클라이언트가 전송한 데이터를 서버가 받기위한 용도와, 서버의 비즈니스 로직 결과를 클라이언트에게 전송할 때 사용된다.

이 중 클라이언트가 전송한 데이터를 서버가 받을 때 클라이언트가 데이터를 지정된 데이터 형식에 맞게 전송을 하는 검증 작업이 필요한데, 이 또한 DTO에서 직접 검증을 할 수 있다. 이 검증 작업을 할때 필요한 라이브러리는 spring-boot-starter-validator 이다.

Lombok / Validation

Lombok

Lombok 어노테이션을 이용해서 Getter, Setter, Constructor, equals/hashCode, toString 등 클래스에서 자주 사용되지만 반복적으로 생성되는 메서드를 간편하게 생성해주는 라이브러리이다.

데이터 입력을 위한 경로


body에 데이터 입력시 값의 구분은 ,로 진행해야한다

POST의 경우 data가 body에 붙어서 가기때문에 포스트맨에서도
url입력한 후에 body부분에 들어가서 json형태로 값을 입력하고나서
send를 보내야 입력이 되게 된다

@Data

@Getter, @Setter, @ToString, @RequiredArgsConstructor, @EqualsAndHashCode 어노테이션이 합쳐진 어노테이션

@EqualsAndHashCode

다른 인스턴스끼리 같다는연산을 하면 무조건 다르게 나옴
(참조변수는 다른 주소를 갖고 있기때문에) 데이터의 비교를 위해서는 equals를 사용

@RequiredArgsConstructor

필수 멤버변수(상수에 해당. final 지정했을때)들을 매개변수로 받는 생성자를 작성해주는 어노테이션

@NoArgsConstructor

기본생성자 만들어준다

@AllArgsConstructor

모든 멤버변수를 매개변수로 받는 생성자를 작성해주는 어노테이션

@Builder

Builder 패턴을 생성해주는 어노테이션

@Builder는 Lombok 어노테이션 중 하나로, Builder 패턴을 자동으로 생성해줍니다.

Builder 패턴은 객체 생성 시 매우 유용한 패턴 중 하나입니다. 객체 생성 시 인자가 많다면 인자를 모두 입력하는 생성자를 작성해야 하지만, Builder 패턴을 사용하면 인자를 한 번에 설정할 수 있어 편리합니다.

@Builder 어노테이션을 사용하면 클래스의 모든 필드에 대해 Builder 패턴을 생성할 수 있습니다. 이를 사용하면 객체 생성 시 필드 값을 직접 설정하는 것이 아니라, Builder를 통해 필드 값을 설정할 수 있습니다.

아래는 @Builder 어노테이션을 사용하여 Builder 패턴을 생성하는 예시 코드입니다.

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
public class Person {
    private String firstName;
    private String lastName;
    private int age;
}

// Person 객체 생성 방법
Person person = Person.builder()
    .firstName("John")
    .lastName("Doe")
    .age(30)
    .build();
@PostMapping("lombok")
    public ResponseEntity<ExampleResponseDto> lombok( 
        @Valid
        @RequestBody exampleDto requestBody
        ){
            String data1 = requestBody.getParameter1();
            String data2 = requestBody.getParameter2();
            String data3 = requestBody.getParameter3();

            // ExampleResponseDto reponseData = new ExampleResponseDto(data1,data2,data3);

            ExampleResponseDto reponseData = 
            ⭐ExampleResponseDto.builder().data1(data1).build(); 
            //builder는 스태틱메서드. 인스턴스를 생성하는것?
            //data1에 data1의 값을 넣어서 인스턴스를 만들어주는것. 
            //빌더는 직접 자리를 지정해서 넣어줄수 있게한다 

            System.out.println(reponseData.toString());

            return ResponseEntity.status(200).body(reponseData);
        
    }
}

위 코드에서 Person 클래스에 @Builder 어노테이션을 선언하면, Person 클래스에 대해 Builder 패턴을 사용할 수 있습니다. 이를 통해 Person 객체를 생성할 때 필드 값을 한 번에 설정할 수 있습니다.

Validation

스프링 프레임워크에서 제공해 주는 유효성 검증 관련 인터페이스이다. 클라이언트로부터 전달 받은 데이터를 데이터타입, 길이, 형태를 검증하여 오류가 있는 경우 오류 메세지를 반환한다. 이것으로 클라이언트에서 전달된 데이터를 서버 측에서 유효성 검증을 수행하고 잘못된 데이터가 입력되어 발생하는 예외를 미연에 방지할 수 있다.

@NotNull❔

@NotEmpty


@NotBlank

@Length

지정한 문자열의 길이 내에 있는지 검증


지정한 범위 초과 입력시 400의 오류가 뜨게 된다.

ExampleDto

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;

@Data //Lombok관련 Annotation
public class exampleDto {

    @NotNull //validation 관련 Annotation
    private String parameter1;
    @Length(min = 0, max = 20) 
    //data2의 길이를 20이상으로 지정하게 되면 400의 오류가 뜨게된다
    private String parameter2;
    private String parameter3;
}

ExampleResponseDto

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;


//@Setter
//@Getter
@Builder
//@ToString
@Data //주석처리한것 포함 다른것들을 기본적으로 다 생성해주게한다.
@AllArgsConstructor // 세가지 모두 매개변수로 받아오는 생성자
public class ExampleResponseDto {
    private String data1;
    private String data2;
    private String data3;
    //멤버변수를 다 받는 생성자가 기본적으로 쓰임
}

RestAPIController
Validator를 적용시키고자 한다면 매개변수에 @Valid 어노테이션을 추가해야한다.

@PostMapping("lombok")
    public ResponseEntity<ExampleResponseDto> lombok( 
    //왜 dto관련해서 request랑 response를 한공간에서 하는거지
        ⭐@Valid @RequestBody exampleDto requestBody
        ){
			String data1 = requestBody.getParameter1();
            String data2 = requestBody.getParameter2();
            String data3 = requestBody.getParameter3();

// ExampleResponseDto reponseData = new ExampleResponseDto(data1,data2,data3);
//builder 사용하지 않고 인스턴스 생성할때

            ExampleResponseDto reponseData = 
            ExampleResponseDto.builder().data1(data1).build(); 
            //builder는 스태틱메서드. 인스턴스를 생성하는것?
            //data1에 data1의 값을 넣어서 인스턴스를 만들어주는것. 
            //builder는 직접 자리를 지정해서 넣어줄 수 있게한다 

            System.out.println(reponseData.toString());

            return ResponseEntity.status(200).body(reponseData);
        
    }

CORS

Cross-Origin Resource Sharing의 약어로, 웹 브라우저에서 실행되는 스크립트가 다른 출처의 리소스에 접근하는 것을 제어하는 보안 메커니즘이다.(포스트맨에서는 알수 없다)

Origin이란 프로토콜, 호스트, 포트 번호를 의미하며, 다른 출처의 리소스에는 XMLHttpRequest와 Fetch API를 비롯한 웹 API에 접근할 수 없다.

config내의 클래스를 이용해서 해결할수 있다.
(cors뚫어주고 시작하는게 좋긴한데 전부 해주는건 안좋고 오리진에 프론트엔드에쓰이는 서버의 프로토콜과 호스트, 포트까지만 적어주는게 보안상 좋게된다.)

접근할 수 있도록 해주는 방법

1. build.gradle 파일에 dependency 추가해준다.

2. config폴더를 생성한다

@Configuration 
//스프링의 기본 설정할수 있도록 맞춰주는것. 막혀있는것을 바꿔준다.
public class CorsConfig implements WebMvcConfigurer{
    
    public void addCorsMappings(CorsRegistry registry){
        registry
            .addMapping("/**") // '*'' 을 사용하면 전부 허용하는것이란 뜻이다
            /*어떤 패스에 대해서 허용할건지 적어주는것*/
            .allowedMethods("*")
            /*어떤 메서드에 대해서 허용할건지?*/
            .allowedOrigins("*"); 
            /*어떤 출처에 대해서 허용할건지에 대한것 적어줌*/
            //웹개발을 위한 용도로 만들겠다할때 그것만 만들고할때 사용    
    }
}
profile
개발자가 될 거야!

0개의 댓글