BE

예외처리를 할 때 @ControllerAdivce를 사용하면 컨트롤러에서 발생하는 예외를 전역적으로 잡아낼 수 있다. 이후, 세부적인 예외케이스는 @ExceptionHandler를 사용한 메소드로 처리하면 된다. 따로 패키지를 분리해서 관리하면 편하다. 예외처리를 적용할 때는 servlet-context.xml에서 component-scan으로 등록해주면 된다. @RestControllerAdvice라는 것도 있는데, @ControllerAdvice 와 @ResponseBody를 합친 것이다. @ControllerAdvice가 뷰를 반환하는 것처럼 @RestControllerAdvice는 응답형태를 JSON/XML 형태로 받을 수 있다. @Controller가 예외 발생하더라도 @RestControlle..

https://jojoldu.tistory.com/361 SpringBoot에서 날짜 타입 JSON 변환에 대한 오해 풀기 안녕하세요? 이번 시간엔 Spring과 JSON에 대해 정리해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Github와 세미나+책 후 jojoldu.tistory.com https://linked2ev.github.io/java/2020/11/06/JAVA-7.-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-JSON-%EA%B0%9D%EC%B2%B4-Date-%ED%98%95%EC%8B%9D-%EB%B..

Error / Runtime Exception / Other Exception 크게 세가지로 구분한다. Error는 JVM이나 시스템 리소스 레벨에서 발생하므로 개발자의 역량으로 막을 수 있는 것이 아니지만 Exception은 개발자가 코드로 적절한 예외처리를 해줌으로써 처리가 가능한 부분이다. 오류(Error)와 예외(Exception)의 차이는 다음과 같다 기본 시스템 자원이 부족하여 오류가 발생했습니다. 코드로 인해 예외가 발생했습니다. 회복 오류는 복구 할 수 없습니다. 예외는 복구 가능합니다. 키워드 프로그램 코드에서 오류를 처리 할 수있는 방법은 없습니다. 예외는 3 개의 키워드 "try", "catch"및 "throw"를 사용하여 처리됩니다. 결과 오류가 감지되면 프로그램이 비정상적으로 종료..

저번에 검색할 땐 잘 안나오더니, 오늘 구글링하니 비슷한 현상을 겪어본 이들이 많았다. 서버 실행 시에 quartz Scheduler에 등록된 task도 당연히 같이 실행되는데 서버를 스톱한다고 얘가 멈추는 게 아니다. 나도 이거 알고 정말 놀랐음. 암튼, 얘가 종종 좀비가 되는 경우가 꽤 있기 때문에 다음과 같은 방법을 고민할 필요가 있다 https://heodolf.tistory.com/136 [JAVA] Quartz 스케줄러 만들기 (3) - Job 강제 종료 서론 지난 포스트에서는 Listener를 적용해보았다. 어떤 순서로 돌아가는지, 오류가 발생했을 때는 어떻게 되는지 궁금해서 수행중인 Job을 강제로 중단시키거나 오류를 발생시키 heodolf.tistory.com https://kimyhcj..

https://velog.io/@dailylifecoding/difference-between-springLegacy-and-springboot-on-jackson-dataformat-xml#-spring-legacy%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%84%A4%EC%A0%95 [Spring MVC] spring boot와 spring legacy 에서 jackson-dataformat-xml 의 converting 우선순위가 다른 이유와 해결 spring boot와 spring legacy에서 다른 동작을 하는 jackson-dataformat-xml! 대체 왜 그런거며, spring legacy에서는 어떤 추가 설정을 해야 될까? velog.io http://bluesky-de..

Aspect Oriented Programming 이라는 말로 관점 지향 프로그래밍이라는 의미 설명은 아무리 읽어도 잘 모르겠는데 트랜잭션 하려면 이것이 필요하다. 주로 서비스 계층에 적용하며, 트랜잭션은 여러 개의 작업이 한 단위로 이루어져야 하는 경우, 즉, 하나라도 오류가 나면 전체 작업이 돌이켜져야 하는 때에 쓰인다. ex) 결제 과정 root-context.xml에 등록된 component-scan이 base-package에 있는 aop 관련 패키지를 스캔하면서 Service의 구현체(Impl)와 관련 LogAdvice가 빈으로 등록되어 LogAdvice에서 설정한 @Before 어노테이션이 동작한다. @Before 어노테이션은 어떤 위치에 advice를 적용할 지 정하는 용도. aop에는 이 ..

먼저 디펜던시에 Spring-tx, AspectJ, AspectJWeaver가 있어야 하고, root-context.xml에 DB 관련 설정이 다 되어있다면, 위의 내용만 더 추가해주면 된다 1. aop는 네임스페이스에서 체크해주어야 함 2. aop 패키지를 새로 추가하는 context:component-scan base-pakage의 주소에 넣어줄 것 위의 에러는 transactionManager를 bean으로 등록하지 않아서 나는 에러이므로 위의 과정을 다 했다면, root-context.xml의 안에 빈을 등록해주면 돌아갈 것이다.

MultipartFile은 Servlet 3.0 이상부터 지원하는 파일을 전송하기 위한 API인데, 업로드된 파일의 이름을 읽어내고, 파일을 저장할 수 있어서 편리하다. 여러개의 파일을 받을 수도 있다. 그런데 .getOriginalFileName() 메소드는 파일이름이 있어야만 작동한다. 만약 fileName이 없이 전송된 경우에는 null이 뜰 것이라, 쓸 수가 없을 것임. 파일의 고유이름이 중요한 이유는 이미지는 원본을 그대로 보여주는 것이 아니라 썸네일을 생성해주는 경우가 많은데 썸네일과 원본 이미지 간의 상관관계를 만들어주기 위해서 필요한 것이다. 원본 이미지의 이름을 메소드로 가져오면 그 값을 기준하여서 서버파일 저장 경로에서 검색하고 동일한 파일은 저장하지 않고, 대신에 썸네일만 따로 저장하..

1000 단위는 K 100만 단위는 m 10억 단위 B 주로 인기있는 웹소설이나 인플루언서의 조회수, 구독수 등에서 보았을 법한 자릿수이다. java에서는 이러한 숫자 단위 변환을 지원해준다. 스택오버플로우에도 많은 이용자들이 변환하는 코드들을 올려두었지만 이미 있는 기능 쓰는 게 더 편함! public final class CompactNumberFormat extends NumberFormat CompactNumberFormat is a concrete subclass of NumberFormat For example: 1000 can be formatted as "1K", and 1000000 as "1M" In the "hi_IN" locale, 1000 can be formatted as "1 ..

Controller는 페이지를 반환하지만(model and view) RestController는 객체 데이터만을 주고받는다. (json or xml) 만약 프론트 단에서 페이지를 그려준다면 RestController로 데이터만을 받아서 그려주면 되지만 그렇지 않다면 Controller가 페이지까지 그려주어야 한다. 서버단에서 그려주는 것이 Server side Rendering (SSR)이고 프론트단에서 그려주는 것이 Client side Rendering (CSR)이다. @Controller 어노테이션이 붙어 있다고 해도 하위 메소드에 @ResponseBody 어노테이션을 붙여서 데이터만을 주고 받을 수 있다. 페이지까지 반환하지 않아도 되는 경우에는 이 부분을 RestController로 독립시킬 ..

로그인 인터셉터는 로그인한 정보에서 페이지마다 활용되는 값이 있을 경우 이를 매번 컨트롤러마다 로그인 정보를 가져와서 활용하는 것이 아니라 인터셉터에서 요청을 가로채서 확인한 다음 해당 컨트롤러를 호출하는 것이다 중복된 코드가 줄어들기 때문에 효율적이라고 할 수 있다 계기 스프링 프로젝트를 만들 때 스프링 시큐리티와 로그인 인터셉터를 만들려고 했지만 너무 어려웠다. 그러나 일일이 접근권한을 설정하기 위해 컨트롤러에 try catch문으로 예외 코드와 리다이렉트 페이지를 설정해주다 보니 너무 번거롭고 혼란스러웠다. 결국 처음 프로젝트를 만들면서 로그인 / 아웃 / 회원가입을 만들어줄 때 이를 제대로 설정하고 넘어가는 것이 적절하겠다는 판단이 들었다. 더욱이 관리자 페이지까지 필요하다면 미리 손보는 것이 더..

A query was run and no Result Maps were found for the Mapped Statement 'xxx.xxx.xxx.mapper.XxxMapper.totalHit'. It's likely that neither a Result Type nor a Result Map was specified 이 에러는 org.apache.ibatis.executor.ExecutorException 마이바티스 에러다 mapper에 쿼리문을 써줄 때 resultType을 지정해주지 않으면 나는 에러. 지정해주지 않아도 잘 될 때도 있는데 이건 왜 이런지 모르겠다 그래서 resultMap을 지정해준다면 어떻게 되는가! attempted to return null from a method wit..