반응형

우선 간단한 게시판을 만들고 있는데

이전에 배운 validation 체크를 해보려고 한다. 

방법은 매우 간단다하다. 

 

우선 부트스트랩 기능을 적극 이용할 예정이다. 

 

벨리데이션체크하는 방법은 

크게 두가지가 있는데 

 
첫번째는 model 객체에 vaild를 사용하여

@Size 등 어노테이션을 이용하는 것이다. 

 

 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@NotNull
@Size(min = 2,max = 30 , message = "제목은 2자이상 30자 이하 입니다.")
private String title;
@NotNull
@Size(min = 1, message = "내용을 입력해주세요.")
private String content;

 

한다면 이와 같이 정의 할 수 있다. 

 

 <div class="form-group">
          <label for="title">제목</label>
          <input type="text"  class="form-control"  th:classappend="${#fields.hasErrors('title')} ? 'is-invalid'" id="title" th:field="*{title}" >
          <div class="invalid-feedback" th:if="${#fields.hasErrors('title')}" th:errors="*{title}">
            제목 에러메시지
          </div>
        </div>
        <div class="form-group">
          <label for="content">내용</label>
          <textarea class="form-control"  id="content" rows="3" th:field="*{content}"  th:classappend="${#fields.hasErrors('content')} ? 'is-invalid'"></textarea>
          <div class="invalid-feedback" th:if="${#fields.hasErrors('content')}" th:errors="*{content}">
            내용 에러메시지
          </div>

 

그 후 타임리프 th:if ="fields.haserrors"로에러가 있다면 에러 메시지를 반환한다.

 

보시다시피 #fields.hasErrors(...) 함수는 매개변수(datePlanted)로 필드 표현식을 수신하고 해당 필드에 유효성 검사 오류가 있는지 여부를 알려주는 부울 값을 반환합니다. 또한 해당 필드에 대한 모든 오류를 얻고 반복할 수 있습니다.

타임리프 공식홈페이지 발췌 

 

그 classAppend로 클래스를  추가해 준다. 

 

is-invalid

추가해 주면 된다.

 

두번째 방법을 알아보자 

 

import org.thymeleaf.util.StringUtils;

@Component
public class BoardVaildator implements Validator{

    @Override
    public boolean supports(Class<?> clazz) {
        return Board.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Board board = new Board();
        if(StringUtils.isEmpty(board.getContent())){
            errors.rejectValue("content", "key" ,"내용을 입력하세요");
        }

    }
}

이 방법은 벨리데이션 메소드를 만들어 서비스와 같이 동작을 하게된다. 

 

    @PostMapping("/form")
    public String greetingSubmit(@Valid Board board, BindingResult bindingResult){
//        vaildator.validate(board,bindingResult);
        if(bindingResult.hasErrors()){
            return "board/form";
        }
        boardRepository.save(board);
        return "redirect:/board/list";
    }
}

form에 전달될때 validator로 검증을 하면 위와 같이 동작한다. 

 

1번의 경우는 간단하지만 세밀한 조정이 어렵다.

2번 같은경우는 세밀한 조정이 가능하지만 클래스를 하나 더 만들어야 한다. 

 

https://github.com/MoonSeokHyun/SpringBoot

반응형
반응형
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

먼저 사용을 위해 디펜던시를 추가 하자 

 

여기서 모든 정보를 보고싶다면

 

yml 파일에 

 

management:
  endpoints:
    web:
      exposure:
        include: "*"

을 추가 하면 

모든 api의 정보를 볼수 있다.

 

 

{
  "_links": {
    "self": {
      "href": "http://localhost:8088/actuator",
      "templated": false
    },
    "auditevents": {
      "href": "http://localhost:8088/actuator/auditevents",
      "templated": false
    },
    "beans": {
      "href": "http://localhost:8088/actuator/beans",
      "templated": false
    },
    "caches-cache": {
      "href": "http://localhost:8088/actuator/caches/{cache}",
      "templated": true
    },
    "caches": {
      "href": "http://localhost:8088/actuator/caches",
      "templated": false
    },
    "health-component-instance": {
      "href": "http://localhost:8088/actuator/health/{component}/{instance}",
      "templated": true
    },

 

완료!

반응형
반응형

안녕하세요 저는 20대 후반 국비지원에 다녔습니다.

국비 지원 수료 후 2달 동안 핀란드 및 각종 외국을 돌아다니면서 공부를 했습니다. 

물론 코딩공부

이력서를 최종적으로 고치고 

 

원티드 및 사람인에 지원을 해보았습니다. 

 

결과를 먼저 말씀드리면 

원티드는 약 30개 지원 중 2군데 서류 합격

사람인은 약 40군데? 지원 후 5군데 정도 연락온 거같습니다.

 

아직까지 미열람 및 완전히 불합통보가 되지않은 곳 포함입니다. 

 

이전 회계직 보다 확실히 취업이 쉬운 것 같습니다.

 

회계 같은 경우에는 약 100군데를 넣으면 1곳이나 2군데 서류 합격이었는데

아 물론 SI 및 스타트업 등등 다 합격 하였습니다.

모두가 SI 기업은 아닙니다.

SI 기업중에서도 주 4일 제 하는 기업에 합격이 되서 솔직히 너무 가고싶었지만 ...

해외라서 사정을 봐주지는 않더라구요

 

저는 현재 코딩 테스트 및 과제나 Spring 에서 API 를 이용하는법 및 rest API 에 대해서 심도 있게 공부 중입니다.

물론 쉬면서요

 

현재 서류 합격한곳 

스타트업 2곳

대기업 관련 1곳 (현재 코딩테스트 과제 수행중)

중소기업 4곳

 

이정도면 충분히 빠르게 취업 가능할 것 같습니다. 

 

파이팅!

반응형

'취업' 카테고리의 다른 글

취업 면접 후기 및 근황  (0) 2022.07.01
백준 브론즈3 달성 수기  (0) 2022.06.09
반응형

짜잔.. 약 29문제를 풀어서 백준 브론즈3 승급을 했다. 

솔찍히 답을 모르면 복붙 수준으로 하는 거같지만 백준 브론즈5나 4정도는 시간만 좀 많다면 

충분히 풀 수 있을 거같다. 

 

백준 브론즈수준은 

그리디 알고리즘 같은 쉬운 알고리즘도 안들어 가는거 같다. 

 

반복문 별찍기 

조건문 활용 이정도 인거 같다.

 

브론즈 1까지 달성 후 실버때 다시 글을 써야 겠다. 

반응형

'취업' 카테고리의 다른 글

취업 면접 후기 및 근황  (0) 2022.07.01
국비지원 수료 후 원티드 및 사람인 지원 후기  (0) 2022.06.12
반응형

Swagger란 개발한 REST API를 편리하게 문서화 해주고, 이를 통해서 편리하게 API를 호출해보고 테스트할 수 있는 프로젝트이다. 기본 swagger2 프로젝트 뿐 아니라 다양한 구성을 가지고 있다

 

API Documentation & Design Tools for Teams | Swagger

 

swagger.io

 

Swagger를 적용 시켜보자 

 

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

우선 이 두가지를 pom.xml에 적용시켜 보자 

 

그렇게 하면 메이븐에서 Swagger를 사용할 수 있게 된다. 

 

일단 config를 하나 생성해주자 

 

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)

}

이렇게 하면 완료 된다.

 

이렇게 편하게 문서 자동화가 가능하다. 

반응형
반응형

 

 

HATEOAS

(Hypermedia As the Enging Of Application State)

 

현재 리소스와 연관된(호출 가능한) 자원 상태 정보를 제공 -> 결국 하이퍼미디어 mapping !

 

RESTful API를 사용하는 클라이언트가 전적으로 서버와 동적인 상호작용이 가능하도록 하는데,

하나의 리소스에서 파생할 수 있는 여러가지 추가 작업의 정보들을 한번에 얻을 수 있다.

 

 

 

링크를 통해서 다른 페이지로 가는 것을 다른 상태로 전이한다고 보고

이 링크들에 대한 레퍼런스를 서버 측에서 전송한다.
그럼으로서 클라이언트가 명시적으로 링크를 작성하지 않고도 

서버 측에서 받은 링크의 레퍼런스를 통해 어플리케이션의 상태 및 전이를 표현할 수 있다. 
이것이 바로 올바른 REST 아키텍처에서의 HATEOAS 구성법이다.

 

장점
- 요청 URI가 변경되더라도 클라이언트에서 동적으로 생성된 URI를 사용함으로써, 

   클라이언트가 URI 수정에 따른 코드를 변경하지 않아도 되는 편리함을 제공한다.
- URI 정보를 통해 들어오는 요청을 예측할 수 있게 된다.
- Resource가 포함된 URI를 보여주기 때문에, Resource에 대한 확신을 얻을 수 있다

 

HATEOAS란? 

 

Hateoas란 REST Api를 사용하는 클라이언트가 전적으로 서버와 동적인 상호작용이 가능하도록 하는 것을 의미합니다. 이러한 방법은 클라이언트가 서버로부터 어떠한 요청을 할 때, 요청에 필요한 URI를 응답에 포함시켜 반환하는 것으로 가능하게 할 수 있습니다

라고 위키에 정의 되어 있다. 

 

HATEOAS를 사용해보자 

 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency>

우선 디펜던스를 폼.xml에 추가 해보자 

 

이렇게 되면 우선 사용이 가능하다. 

 

 

@GetMapping("/users/{id}")
public Resource<User> retrieveUser(@PathVariable int id) {
    User user = service.findOne(id);

    if (user == null) {
        throw new UserNotFoundException(String.format("ID[%s] not found", id));
    }

    // HATEOAS
    Resource<User>  resource = new Resource<>(user);
    ControllerLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers());
    resource.add(linkTo.withRel("all-users"));

    return resource;
}

우선 User 객체를 반환한다. 

user 객체가 추가적으로 사용할 수 있는 정보(링크)를 하이퍼미디어 타입으로 넣어준다. 

이때 static 메소드를 사용하면 아래의 코드를 길게 쓰지 않아도 된다.

 

//ControllerLinkBuilder linkTo = ControllerLinkBuilder.linkTo(
        //ControllerLinkBuilder.methodOn(this.getClass()).retrieveAllUsers());

retrieveAllUsers() 메소드와 "all-users" 이름으로 링크를 작업한다. 

 

link작업이 완료 되었다.

반응형
반응형

다국어 처리를 위해 프로퍼티스파일에 저장을 해서 

컴퓨터에 저장된 언어코드에 따라서 서버에 지정된 내용으로 보여준다. 

 

일단 yml 파일에 프로퍼티스에 만들어줄 파일을 선언해준다.

 

spring:

  messages:
    basename: messages

우선 나는 messages라는 이름의 프로퍼티 파일을 만들 것이다.

 

 

이런 식으로 선언을 만들어 주면 된다. 

 

그후 메인 로컬에 있는 빈등록 을 해준다. 

 

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver localeResolver = new SessionLocaleResolver();
    localeResolver.setDefaultLocale(Locale.KOREA);
    return localeResolver;
}

그 다음 컨트롤러에서

 

@GetMapping(path = "/hello-world-internationalized")
public String helloWorldInternationalized(
        @RequestHeader(name="Accept-Language", required=false)  Locale locale) {
    return messageSource.getMessage("greeting.message", null, locale);
}

프로퍼티의 이름이 Greeting.message라면 해당 내용을 출력해준다!

 

 

반응형
반응형

@past 나 @Size로 Vaule값을 검증해보자 

 

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>

우선 벨리데이션을 쓰려면 

메이븐 타입이라면 추가해주자 

 

@Data
@AllArgsConstructor
@JsonIgnoreProperties(value = {"password","ssn"})
public class User {
    private Integer id;

    @Size(max=2, message = "Name은 두글자 이상 입력해주세요!")
    private String name;
    @Past
    private Date joinDate;

@Size를 걸어서 서버에서 Name값을 사이즈를 2미만이라면 예외처리를 해보자 

 

@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user){
    User savedUser = service.save(user);

    URI location =  ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
            .buildAndExpand(savedUser.getId()).toUri();

    return ResponseEntity.created(location).build();
}

@Vaild라는 어노테이션을 활용하여 구성하면 끝이난다.

반응형
반응형

예를 들면 1~3번 까지 기존 데이터가 있는데 

100번 데이터를 입력 했다고 가정해보자

그러면 오류가 날 것이다. 

 

이때 예외처리를 할 것이다. 

 

이전 DeleteUser에서 

 

if(user ==  null){
    throw new UserNotFoundExeception(String.format(id + " not pound"));
}

이것을 하기위해

UsernotFoundException이라는 클래스를 만들어 보자 

 

package com.example.restfulwebservice.user;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

// 2xx -> ok
// 4xx -> 클라이언트가 잘못
// 5xx -> 서버가 잘못
@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundExeception extends RuntimeException {
    public UserNotFoundExeception(String message) {
        super(message);
    }
}
ResponseStatus

을 사용하여 Not Foind를 선택해준다. 

이것은 500에러를 404에러로 변경해주기도 한다. 

그 후 아까 지정한

 

user가 없으면 메시지를 출력해준다. 

 

if(user ==  null){
    throw new UserNotFoundExeception(String.format(id + " not pound"));
}

100을 입력하면 100은 없다고 메시지가 출력된다.

 

반응형
반응형

저번에 해보았던 회원 등록에 이어서 삭제까지 해보고자 한다.

드디어 처음 DeleteMapping 이다. 

 

우선 서비스 클래스를 보면 

 

Iterator로 저번에 만들어둔 list 타입을 불러와보자 

user 객체로 iterator.next()로 한개 씩 불러보자 

 

그다음 while hasNext로 for문과 같은 경우이다. 

그다음 if문을 통해 불러온 아이디와 발견한 id가 같다면 

유저를 리턴한다. 

 

@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable int id){
    User user = service.deleteById(id);

    if(user ==  null){
        throw new UserNotFoundExeception(String.format(id + " not pound"));
    }

}

DelMapping 으로 User/{id}로 pathVariavble을 해준다. 

user를 불러와서 service객체에 접근한다. 

 

그리고 서비스에서 불러온 값을 다시 리턴해준다. 

 

여기서 1번 데이터를 지워보자

 

딜리트로 신호를 보내보자 

 

삭제가 잘 되었다!

반응형

+ Recent posts