SPRING

@Scheduled / @Validation / View Mapping 방법

silver-w 2024. 12. 10. 12:09

@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)