@Scheduled 스케쥴링 코드
ex - 회원탈퇴 후 6개월동안 개인정보를 가지고있다가 기간이 지나면 자동삭제
특정 시점에 자동으로 메서드가 실행되는 기능이 필요할 때
@Scheduled와 @inableScheduling 애노테이션을 사용하면 된다.
(예제는 보통 쿼리 실행을 할 때 사용하므로 @Service 선언을 하였음)
package com.example.ex1;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class MySchedule {
@Scheduled(cron = "0 0 7 1 * *")// 매달 1일날 오전 7시에 해당 코드를 실행하겠다.
public void scheduleTest() {
// 특정 날짜(시간)에 실행될 코드
System.out.println("스케쥴링 테스트 코드 호출");
}
}
@SpringBootApplication
@EnableScheduling // Scheduling을 적용할 수 있는 메서드를 찾아 실행시킨다.
public class Ex1Application {
....
}
방법
① Spring bean pool 에 스케쥴링 메서드를 등록시킨다.
② Scheduled Annotation 으로 자동 실행될 시점 지정 및 메서드 지정
③ spring bean pool을 @springBootApplication 클래스에 @EnableScheduling 애노테이션으로 빈에서 호출한다.
※ scheduled 애노테이션의 reference

@Validation (back-end에서 유효성 검사할 수 있는 방법)
- back-end 유효성 검사를 하기 위해서는 유효성 검사를 위한 각 커맨드 객체가 필요하다
(참고1) VO 객체와 커맨드 객체의 차이 - VO 객체는 클라이언트에서 값을 그대로 받거나 select 등으로 값을 반환 - 커맨드 객체 : 클라이언트에서 값을 받을 때 유효성 검사를 거쳐서 받는다. ※ 커맨드객체와 Errors의 객체는 모델에 담지 않아도 타입이름을 카멜표현식으로 변환해서 그대로 불러오면 view에서 호출이 된다. (참고2) 유효성 검사 방법 ① 클라이언트 : FORM (Jquery) ② 백 : @Controller 에서 if 분기 ③ 백 : @Validation API 사용 : 에러 코드를 반환 - Rest API에서는 백엔드에서 유효성 검사를 완료 해야한다. |
@Validation 사용법
① 라이브러리 추가
<!-- validation-->
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> |
② 유효성 대상인 커맨드 객체를 만들고 유효성 조건을 필드에 선언한다.
- validation 유효성 검사 식을 커맨드 객체 클래스 필드부분에 애노테이션 붙이기
- [41] springboot validation을 이용한 커맨드객체 유효성 검사 : 네이버 카페
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MemberCommand {
@NotBlank(message = "fill in required form") // 널 체크
@Size(min = 1, message = "이름을 입력하세요.") // 공백체크
private String name;
}
③ 매개값에서 유효성 검사할 파라미터에 @Valid 선언, 컨트롤러에서 error.hasErrors()로 유효성 분기
ㄴ Errors 타입은 배열이다. ( 에러가 당일값이라는 보장이 없기 때문)
ㄴ 유효성은 Request.getParameter 타이밍에 체크한다.
@Controller
public class MemberController {
// back end 유효성 검사하는 Spring API
@PostMapping("/addMember")
public String addMember(@Valid MemberCommand m, Errors err, Model model) {
System.out.println("input = " + m.toString() + ", err =" + err.hasErrors());
if(err.hasErrors()) { // 커맨드 객체를 받아올때, 에러가 있는지 없는지 확인 (true = 에러있음 )
for(FieldError fe : err.getFieldErrors()) {
System.out.println(fe.getField()); // name
System.out.println(fe.getDefaultMessage()); // "이름을 입력하세요"
model.addAttribute(fe.getField() + "Msg", fe.getDefaultMessage()); // {nameMsg : "이름을 입력하세요"}
// 커맨드 객체는 모델에 담지않아도 뷰로 넘어간다, 단 클래스이름의 카멜표현식 그대로 넘어감
// 뷰에서 "${memberCommand.name}" 로 호출가능
}
return "addMember"; // 유효성 검사에 걸리면 Command객체 + Msg 입력폼으로 다시 포워딩
}
return "";
}
@GetMapping("/addMember")
public String addMember() {
return "addMember";
}
}
Errors 클래스 메서드
- hasErrors() : 에러가 있다면 true를 반환
- getField() : 커맨드 객체에서 어느부분을 검사했는지 필드명을 반환
- getDefaultMessage() : 커맨드 객체에 설정한 에러메세지를 반환
<body>
<form method="post" action="/addMember">
name : <input type="text" name="name" value="${memberCommand.name}">
<span>${nameMsg}</span>
<button type="submit">등록</button>
</form>
</body>
§ value="${memberCommand.name}" : 커맨드 객체는 컨트롤러에서 모델로 넘기지 않아도 커맨드객체이름을 카멜표현식으로 바꿔서 입력하면 호출할 수 있다.
§ ${nameMsg} = model.addAttribute(fe.getField() + "Msg", fe.getDefaultMessage()); 부분을 호출 한 것
컨트롤러에서 뷰 매핑 방법
@Controller
public class OneController {
// 리턴값 : String - 리턴값이 view이름
public String a() {
return "a";
}
// 리턴값 : void - 메서드 이름이 view의 이름이 된다 (b.jsp)
// 매핑 난해, / 사용불가 등으로 사용하기 어려움
public void b() {
}
// 리턴값 : ModelAndView - view와 model을 같이 담아 리턴한다. (c.jsp)
// reference 권장
public ModelAndView c() {
ModelAndView mav = new ModelAndView();
mav.setViewName("c");
return mav; //
}
}
(1)
'SPRING' 카테고리의 다른 글
@SpringBootApplication 역할 나누기 (0) | 2024.12.10 |
---|---|
[Rest API]퍼머링크 형식와 일반적인 URL 형식 (0) | 2024.12.10 |
[LOMBOK]@AllArgsConstructor (롬복기능) (0) | 2024.12.10 |
[Rest API] JSON과 XML로 반환 방법 (0) | 2024.12.10 |
DI / Bean(@ComponentScan) (0) | 2024.12.09 |