2023.06.23 TIL
(1) 예외
- Dao에서 예외를 던지고, Service에서도 예외를 던지고, Controller에서도 예외를 던지고 예외를 처리하는 것은 무엇일까>
- DispatcherServlet에서 던져봤자 특별히 예외를 처리하는것이 없기 때문에 ControllerAdvice를 사용해야 한다.
(2) @ControllerAdvice
- 컨트롤러가 디스패처서블릿한테 예외를 던지는데 디스패처서블릿에 건너지기 전에 ControllerAdvice가 예외를 잡아서 처리해준다.
- @ControllerAdvice를 달아주면 특정 타겟들을 감시하고 있다가 그 타겟들에 예외가 발생하면 처리해줄 수 있다.
- 설정해야 할 것은 '누구를 감시할 건지', '뭐라고 할 건지'를 설정해야 한다.
@ControllerAdvice(annotations = Controller.class)
- 이렇게 달아주면 특정 어노테이션을 감시하는 것도 가능하다.
- 컨트롤러 어노테이션이 담긴 클래스들을 감시한다.
- 404에러가 발생하면, ControllerAdvice가 발생하지 않는다.
- ControllerAdvice는 컨트롤러 어딘가에서 예외가 발생하면, 그 예외를 가져와서 작업하는게 ControllerAdvice이다.
- 404에러를 처리하고 싶으면, web.xml에 가서 처리를 해줘야 한다.
- 편법을 이용해서 404에러를 이 어노테이션으로 처리할 수 있다.
- 따로 컨트롤러를 만들어서 ("*")이런 식으로 requestmapping을 설정해줘서 잘못된 경로를 접근할 경우,
- 이를 처리하는 에러페이지를 만들어서 보여주면 된다.
(3) @ExceptionHandler
- 이 어노테이션을 달아주면 타겟에 예외가 발생하면 이 어노테이션이 달린 메소드가 실행된다.
- 디스패처서블릿이 컨트롤러에 넘겨주는 request, response, session을 다 받아줄 수 있다.
- 넓은 예외, 좁은 예외를 설정해서 디테일하게 에러 처리가 가능하다.
- 자식 레벨에 있는 것(더 좁은)이 먼저 처리한다.
(4) resource
- webapp아래에 resources라는 폴더가 자동으로 만들어져 있다.
- 이곳에 정적인 파일들을 넣어줄 수 있다.(html, css, img 등등)
<resources mapping="/resources/**" location="/resources/" />
- xml 파일에 이걸 설정해놓으면 image태그에 src에 적어놓은 값은 디스패처 서블릿으로 넘어가는 것이 아니라 바로 정적 파일을 볼 수 있게 된다.
- 이 경로가 잘못되어 있으면 제대로 동작하지 않게 된다.
(5) redirect
- redirect해서 parameter값을 넘길때 어떻게 해야 할까?
@GetMapping("test")
public String test(RedirectAttributes ra) {
ra.addAttribute("nick", "zzzzzzzz");
return "redirect:/home";
}
- 이런 식으로 RedirectAttributes라는 파라미터를 넣어서 사용하면 된다.
(6) detail?no=3 vs detail/3
@GetMapping("detail/{no}")
@ResponseBody
public String detail(@PathVariable String no) {
return no+"xxxx board ~~";
}
- no를 입력하면 {no}에 변수를 담을 수 있다.
- @PathVariable 어노테이션을 달아줘야 {}에 값을 담을 수 있다.
- 파라미터 변수의 이름과 {}안의 이름이 같으면 따로 지정 안해줘도 된다.
- redirect할 때 편하게 쓸 수 있는 법이다.
(7) 로깅(log4j.xml에 존재)
- 객체에 info()라는 이름으로 출력문을 볼 수 있다.
- warning(), error(), debug() -> System.out.println() 처럼 하나만 있는게 아니라 여러개의 메소드가 존재한다.
- 로깅을 쓰는게 좋은 이유는 개발 단계에서 디버깅을 하고 싶으면, x.debug()가 동작한다.
- System.out.println()은 항상 동작하는데, 프로젝트에 로그 레벨을 info라고 설정해놓으면 info가 출력이 되고, warning으로 설정하면 warning이 출력된다.
- 그 레벨에 가진 것들만 출력이 된다.
- 만약 로그 레벨을 인포가 아니라 trace로 설정하면 trace부터 그 이상에 해당하는 것들이 전부 다 동작한다.
- 만약 로그 레벨을 warning으로 하면 그 이하만 동작한다.
- 해당 레벨 이상의 것들만 사용할 수 있다.
- 배포할 때, 레벨만 맞춰주면 출력문이 그 레벨에 해당하는 것들만 나온다.
- appender : 출력할때 console에 출력할 건지, file에 출력할 건지 설정할 수 있다.
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>
- PatternLayout 와 System.out 합해서 ConsoleAppender를 만들어주고 있다.
1. 로거 사용법
//클래스 정보 전달
private Logger logger = LoggerFactory.getLogger(MemberController.class);
//회원가입
@PostMapping("join")
@ResponseBody
public String join(@RequestParam HashMap<String, String> paramMap) {
logger.info("회원가입 요청 받음");
logger.info(paramMap.toString());
return "join Success";
}
2. 롬복을 이용해서 로거 사용할 수 있음
@Controller
@RequestMapping("member")
@RequiredArgsConstructor
@Slf4j
public class MemberController {
//회원가입
@PostMapping("join")
@ResponseBody
public String join(@RequestParam HashMap<String, String> paramMap) {
log.info("회원가입 요청 받음");
log.info(paramMap.toString());
return "join Success";
}
}
if(디버그가능여부) {
log.debug("전달받은 데이터 : "+paramMap.toString());
}
-> 이처럼 데이터를 출력할때는 if로 해서 디버그 가능 여부를 체크해야 할까?
-> 그 이유는 + 때문이다. 느려지니까 컴퓨터가 한번 더 일을 해야 한다.
-> 즉, 연산이 끝나고 나서 실행되니까 출력하지도 않을 건데 한번더 연산을 해버리게 된다.
-> 그러니까 아예 디버그 가능여부를 체크해서 if문을 써주는게 권장이 되었다.
-> 하지만 요즘은
log.debug("전달받은 데이터 : {}", paramMap.toString());
-> 이렇게도 작성이 가능하기 때문에 출력이 잘 된다. paramMap.toString()이 { } 사이에 들어간다.
3. Appenders 의미
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
- %p(priority) : 로그 레벨을 설정하는 것. trace를 출력할 수 있게 된것이 바로 이것 덕분이다.
- %c(class) : 클래스
- %m(message) : 메세지
- %n : 개행문자 == 줄바꿈
- %d(date) : 로그를 남길 때는 언제 발생하는지 알아야 한다, 이걸 확인할 때 쓰는 것
%-5p -> 왼쪽 정렬로 5칸을 맞춰서 출력하겠다라는 의미
%10p -> 10칸을 오른쪽에다 채운다는 것을 의미
4. 파일로 로거 설정하기
<파일의 종류>
Console appender,
File appender,
DailyRollingFile appender -> 날짜별로 파일이 바뀌는 로거
RollingFileAppender
5. XMLLayout
- XMLLayout을 이용해서, 파일을 설정하는 방법도 있는데 잘 안 쓴다.
‼‼ 어펜더는 여러개 추가가 가능하다
- console, file 둘 다 사용 가능함