반응형

클라이언트 측에서 넘어온 데이터를 객체에 바인딩할 때 @Valid와 @Validated로 유효성 검사를 할 수 있습니다.

 

우선 각 빌드에 맞게 의존성을 추가합니다.

 

Gradle일 경우, build.gradle에 의존성 추가

dependencies{
    ...
    implementation 'org.springframework.boot:spring-boot-starter-validation'
}

 

Maven일 경우, pom.xml에 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.6.3</version>
</dependency>

 

유효성 검사를 위한 어노테이션 적용

객체에 유효성 검사를 적용할 필드에 어노테이션을 적용합니다.

 

public class Article {

    private Long id;
    
    @NotEmpty
    private String title;
    
    @NotEmpty
    private String content;
    
    ...

}

 

어노테이션 종류

Anotation 제약조건
@NotNull Null 불가
@Null Null만 입력 가능
@NotEmpty Null, 빈 문자열 불가
@NotBlank Null, 빈 문자열, 스페이스만 있는 문자열 불가
@Size(min= , max= ) 문자열, 배열등의 크기가 만족하는가?
@Pattern(regex= ) 정규식을 만족하는가?
@Max(숫자) 지정 값 이하인가?
@Min(숫자) 지정 값 이상인가
@Future 현재 보다 미래인가?
@Past 현재 보다 과거인가?
@Positive 양수만 가능
@PositiveOrZero 양수와 0만 가능
@Negative 음수만 가능
@NegativeOrZero 음수와 0만 가능
@Email 이메일 형식만 가능
@Digits(integer= , fraction = ) 대상 수가 지정된 정수와 소수 자리 수 보다 작은가?
@DecimalMax(value= )  지정된 값(실수) 이하인가?
@DecimalMin(value= ) 지정된 값(실수) 이상인가?
@AssertFalse false 인가?
@AssertTrue true 인가?

 

Controller에서 유효성 검사

해당 유효성 검사를 할 것인지에 대해 Controller에서 @Valid를 통해 적용할 수 있습니다.

 

@RestController
public class ArticleController {

    ...

    @PostMapping("/article/write")
    public ResponseEntity articleWrite(@RequestBody @Valid Article article) {
        ...
    }

}

 

@Validated

@Validated 어노테이션은 스프링에서 제공하는 @Valid 기능을 확장한 어노테이션이고 그룹핑 목적으로 사용합니다. 예를 들어 위 예제에서 본 Article 클래스에서 @NotEmpty를 통해 게시글 제목과 내용에 null값과 빈 문자열이 들어가지 못하도록 설정했는데 @Valid를 사용하면 필드에 적용된 모든 어노테이션에 대한 검증이 이뤄지므로 특정 필드만 유효성 검사를 하고 싶을 경우에는 필드를 그룹핑하여 일부만 유효성 검사를 할 수 있습니다.

 

그룹을 지정하기 위한 용도의 클래스를 하나 생성하고 그룹별 interface를 클래스 내에 생성합니다.

 

public class ValidationGroups {

    public interface groupA {};
    public interface groupB {};

}

 

 

그리고 적용할 필드에 그룹을 적용하면 그룹핑이 끝납니다.

 

public class Article {

    private Long id;
    
    @NotEmpty(group = {ValidationGroups.groupA.class})
    private String title;
    
    @NotEmpty(group = {ValidationGroups.groupB.class})
    private String content;
    
    ...

}

 

위에서 본 예제 Controller에 유효성 검사 시 게시글 내용만 null값을 체크하고 싶으면 아래 코드처럼 적용하시면 됩니다.

 

@RestController
public class ArticleController {

    ...

    @PostMapping("/article/write")
    public ResponseEntity articleWrite(@RequestBody 
                                       @Validated(ValidationGroup.groupB.class) Article article) {
        ...
    }

}
반응형
반응형

일반적으로 REST API를 만들게 되면 @RestController를 이용하여 JSON 형식으로 값을 반환하게 됩니다. 일반적으로 데이터를 반환할 때 상태값을 넘겨주는데 이 때 사용하는 게 Spring Framework에서 제공하는 ResponseEntity입니다.

 

ResponseEntity는 HttpEntity를 상속받습니다.

ResponseEntity의 HttpEntity 상속

위 이미지처럼 ResponseEntity는 HTTP 요청에 의한 HttpStatus, HttpHeader와 HttpBody를 포함하는 HttpEntity 클래스를 상속받습니다.

 

반응형
반응형

Spriong Boot Devtools

Devtools는 Spring Boot에서 코드가 수정되면 어플리케이션을 재실행해야 되는 불편한 점을 해결할 수 있도록 제공되는 모듈입니다.

 

설정 방법

1) build.gradle의 dependencies에 내용 추가

 

17번째 줄에 있는 내용 추가

 

2) Settings > Advanced Settings > Allow auto-make to start even if developed application is currently running 체크

 

 

3) Settings > Build, Execution, Deployment > Complier > Build project automatically 체크

 

 

반응형
반응형

Spring(혹은 Spring Boot)으로  포트폴리오 어떻게 만들어야 되는지 물어보는 친구들이 꽤 있어서 제가 만드는 순서를 적어봅니다! 물론, 저도 주니어 개발자고 모르는 부분이 많기 때문에 제가 만드는 순서는 분명 틀린 부분이 많이 있을 겁니다. 참고 정도로만 읽어주세요. 포트폴리오이기 때문에 왜 이런 환경을 구성했는지 설명할 수 있어야 해서 설명도 첨부합니다. 가장 중요한 건 자기 스스로 만들고 자기만의 사이트를 어떻게 만들었는지 설명하는 능력이니 이 부족한 글에 의존하시는 분은 안 계시겠지만서도 혹시 계신다면 그러지 마시길!

 

1. 환경 구성

너무 당연하지만 개발 환경을 세팅해야 합니다. 포트폴리오의 완성은 개발하여 배포까지 하는 것이기 때문에 마무리까지 어떤 프로그램들이 필요한지 생각하고 준비해야 합니다. 제 프로젝트 환경은 아래와 같습니다.

 

IDE(통합개발환경) : IntelliJ Ultimate(유료 버전)

- 설명 : 젯브레인에서 만든 IDE로 플러그인 추가 및 DB 접근 기능 등 이클립스와 큰 차이가 있지는 않지만 툴팁을 열 때 자주 렉이 걸리는 이클립스보다 프로그램 자체가 가벼워 선호하게 되었습니다. 무료 버전은 HTML, JSP와 Java Script 및 CSS 등 일부 자동완성을 지원하지 않기 때문에 유료 버전 Ultimate를 사용하고 있습니다.

 

소스 코드 편집기 : Visual Studio Code(퍼블리싱 목적)

- 설명 : 퍼플리싱 목적으로 사용합니다. 인텔리제이 얼티메이트 버전에서는 퍼블리싱에 필요한 기능도 제공하지만 퍼블리싱 학습 때 사용했던 환경이 VS Code였기 때문에 익숙하여 사용중입니다.

 

개발 언어 : Java 1.8

- 설명 : 자바 버전 중에서 가장 보편적이고, 배포 서버인 Cafe24가 1.8 환경이기 때문에 선택하였습니다.

 

프레임워크 : Spring Boot

- 설명 : 스프링 레거시 프로젝트에 비해 다룰 초기 설정이 적습니다. 톰캣이 내장되어 있고 의존성을 추가할 때도 Starter가 붙은 의존성을 추가하면 필요한 관련 라이브러리를 자동으로 추가해주므로 간편합니다. 다만 톰캣이 내장되어 있어 서블릿으로 동작하는 JSP를 권장하지는 않습니다. 하지만 초기 설정 하나만으로도 스프링 레거시 프로젝트보다 개발 속도가 빨라지기 때문에 사용하고 있습니다.

 

데이터베이스 : MariaDB

- 설명 : MySQL이 Oracle에게 인수되면서 등장한 DBMS입니다. MySQL과 거의 동일하게 동작하며 배포 서버인 Cafe24에서 MariaDB를 사용하기 때문에 선택했습니다.

 

데이터베이스 관리툴 : MySQL Workbench

- 설명 : DB를 GUI 환경에서 사용할 수 있게 해주는 툴입니다. 툴 내에서 권한 부여가 안 된다거나 일부 기능을 사용할 수 없는 문제가 MariaDB에서 발생하지만 학습 때 계속 사용하던 툴이라 익숙하여 선호하고 있습니다. 

 

DB 접근 기술 : JPA

- 설명 : 객체 관계 매핑 기술입니다. 객체들의 관계를 통해 SQL을 자동으로 생성해주며 세계적으로 MyBatis보다 많이 사용되고 있습니다. JpaRepository를 통해 간단하게 CRUD를 구현할 수 있습니다.

 

View 템플릿 : JSP

- 설명 : HTML에 JSP 코드를 추가하여 페이지를 동적으로 만드는 템플릿입니다. 톰캣이 있어야 동작하고 스프링 부트에서는 공식적으로 지원하지 않으며 권장하지도 않습니다. 스프링 부트에서는 타임리프나 머스태시 같은 템플릿을 권장하지만 한국은 SPA(Single Page Application, React.js나 Vue.js)를 사용하지 않는 이상 템플릿으로는 아직 JSP를 많이 사용하기 때문에 선택하였습니다. 스프링 부트에서 권장하지 않을쭌 패키징을 War로 하면 정상적으로 작동합니다.

 

배포 서버 : Cafe24

- 설명 : AWS와 네이버 클라우드와 같은 클라우드 플랫폼으로 구성하면 더 좋은 포트폴리오가 될 수 있지만 Cafe24 호스팅 센터를 이용하면 클라우드 시스템을 이용할 때 필요한 Java, MariaDB, Tomcat 설치가 기본적으로 이뤄져 있어 간편하기 때문에 선택하였습니다. AWS 사용에 익숙해지면 Cafe24에서 변경할 수도 있습니다. 

 

FTP 접속 툴 : Filezilla

- 설명 : FTP 서버에 접속하기 위한 툴입니다.

 

SSH 접속 툴 : Putty

- 설명 : SSH 서버에 접속하기 위한 터미널 툴입니다.

 

2. 프로젝트 생성

포트폴리오를 위해 스프링부트 프로젝트를 생성합시다. Spring Initializr 사이트(https://start.spring.io/)에서 프로젝트를 구성할 수 있습니다. 인텔리제이 얼티메이트 버전을 사용하면 사이트에 접속하지 않아도 인텔리제이 내에서 구성 가능합니다.

 

1) 빌드 : Gradle

 

2) 언어 : Java

 

3) 스프링 부트 버전 : 2.6.3

 

4) 의존성 : Spring Web, Spring Data JPA, MariaDB Driver, Lombok, Spring Security

 

5) application.properties : 배포 서버인 Cafe24에서 생성된 DB와 연결합니다.

 

 

3. 스프링 부트에서 JSP 사용

앞에서 언급하였듯 스프링 부트에서는 JSP를 공식적으로 지원하지 않기 때문에 따로 설정해줘야 합니다. 관련 내용을 따로 작성해두었으니 아래 링크를 참고하여 설정하세요!

 

https://developer-rooney.tistory.com/192?category=476321

 

 

4. 패키지 구성

가장 필수적인 패키지 구성

main/java/최상위 패키지 밑에 controller, entity, repository, service 패키지를 생성합니다. 각각의 패키지가 하는 역할을 고려하여 어떻게 개발할지 생각해봅시다.

 

예를 들어, 전체 게시글이 나오는 페이지를 메인에 보여주고 싶다면 우선 controller 패키지에 HomeController 클래스를 만들고 기본 Url로 접속 시 메인으로 이동할 메소드를 하나 만들어 줘야 합니다. 그리고 메소드가 리턴할 JSP 페이지도 필요하겠죠? 퍼블리싱이 다 되었다는 가정 하에 데이터를 가져오려면 페이지 생성 후 뭐부터 해야할 지 생각해봅시다. DB에서 데이터를 가져오기 위한 BoardRepository를 repository 밑 패키지에 작성해야 됩니다. 그런데 우리는 JPA를 사용하고 BoardRepository는 JpaRepository를 상속 받아야 하는데 이 때 해당 테이블의 Entity와 해당 Entity의 기본키 타입이 되는 클래스를 알아야 하기 때문에 Entity를 먼저 작성해줘야 합니다.

 

5. 테이블 생성

엔티티 작성을 위해 MariaDB에 테이블을 생성해주세요. 생성한 테이블의 컬럼에 맞춰서 프로젝트 엔티티를 작성해야 합니다.

 

 

* 작성중

반응형

+ Recent posts