Replies: 1 comment
-
Junit4 혹은 5만 사용해봐서 Junit3 경우 테스트 메서드 이름을 test로 시작하는 것을 타겟으로 테스트 한다는 것을 처음 알았습니다. 저는 이미 만들어진 어노테이션을 아닌 제가 직접 어노테이션을 사용해본 경험을 되돌려 보니 자바와 스프링에서 제공한 특정 상황을 예로 든다면 @PostMapping("/update")
@ResponseBody
public String updateBoard(@RequestBody BoardDto boardDto, HttpSession session) {
String username =(String)session.getAttribute("id");
boardService.updateBoard(boardDto);
return "success";
} @PostMapping("/update")
@ResponseBody
public String updateBoard(@RequestBody BoardDto boardDto, HttpSession session) {
String username = (String) session.getAttribute("id");
if (username == null || !username.equals(boardDto.getAuthor().getUsername())) {
throw new RuntimeException();
}
boardService.updateBoard(boardDto);
return "success";
}
모든 dto값이 이동하는 부분에서 세션의 정보와 dto 값을 비교하는 코드를 사용한다면 중복이 발생할 것이고.. 이전 어노테이션 방식처럼 간단한 방법이 존재하지 않을까? @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MemberValidation.class)
public @interface MemberCheck{
String message()default "현재 로그인한 아이디와 작성자가 다릅니다.";
} public class MemberValidation implements ConstraintValidator<MemberCheck, Member> {
@Override
public boolean isValid(Member member, ConstraintValidatorContext context) {
HttpServletRequest req =((ServletRequestAttributes)Objects.requireNonNull(
RequestContextHolder.getRequestAttributes())).getRequest();
String sessionId =(String)req.getSession().getAttribute("id");
if(sessionId == null) {
return false;
}
return member.getUsername().equals(sessionId);
}
} @PostMapping("/update")
@ResponseBody
public String updateBoard(@Validated @RequestBody BoardDto boardDto) {
boardService.updateBoard(boardDto);
return "success";
}
이번 주제에 맞게 어노테이션을 이용한다면
정리 감사합니다.!! |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
명명 패턴?
명명 패턴의 단점
tsetSafetyOverride
라고 짓더라도 단순히 무시될 뿐 오타가 발생했다는 것을 인지하기 어려움TestSafetyMechanisms
로 지어 테스트를 수행하려고 해도 JUnit은 테스트를 무시할 뿐 어느 경고 메시지도 출력하지 않음=> 애너테이션을 사용하면 위 3가지 문제점을 해결할 수 있음
간단한 테스트 프레임워크 만들기
@Retention
은 언제까지 해당 애너테이션이 유지되어야할 지 정의하는 애너테이션 (https://jeong-pro.tistory.com/234#comment14510614)@Target
은 어느 레벨에 해당 애너테이션이 사용되어야할 지 정의하는 애너테이션@Repeatable
메타애너테이션을 달면 한 요소에 여러 번 사용할 수 있음.@Repeatable
애너테이션을 사용하기 위해서는@Repeatable
을 단 애너테이션을 반환하는 컨테이너 애너테이션을 정의해야 함@Repeatable
에 컨테이너 애너테이션의 class 객체를 매개변수로 전달해야 함getAnnotationsByType
메서드는 애너테이션과 컨테이너 애너테이션을 구분하지 않지만,isAnnotationPresent
메서드는 그 둘을 구분하기 때문에 두 타입 모두 수용하도록 조건을 걸어야 함.결론
참고 : instanceof vs isInstance()
Beta Was this translation helpful? Give feedback.
All reactions