์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- s3 ์ด๋ฏธ์ง ๋ค์ด๋ก๋
- aws saa ํฉ๊ฒฉ
- docker ps -a
- Kafka
- s3 log ์ ์ฅ
- ํ๋ก๊ทธ๋๋จธ์ค ํฉ์นํ์์๊ธ
- docker-compose kafka
- Codedeploy ์ค๋ฅ
- ์๋ฒ ํฐ์ง๋ ๋์ปค ์ฌ์คํ
- docker
- ํ๋ก๊ทธ๋๋จธ์ค ์ปฌ๋ฌ๋ง๋ถ
- redis ํ ์คํธ์ฝ๋
- ๋ค์ค ์ปจํ ์ด๋
- ํ๋ก๊ทธ๋๋จธ์ค
- ์๋ฐ
- JPA
- @RestControllerAdvice
- prod docker-compose
- aws ์ฟ ํฐ
- nGrinder
- Entity
- ์ ํจ์ค ์ค์ผ์ค๋ฌ
- ์ ํจ์ค ๋น๋ ์ค๋ฅ
- s3 ์ด๋ฏธ์ง ์ ์ฅ
- ํ์ดํผ๋ฐ์ด์
- docker compose
- redis ์กฐํ
- private subnet ec2 ๋ก์ปฌ ์ ์
- AWS Certified Solutions Architect - Associate
- ์คํํ๋ ๋ฏธ์ค
- Today
- Total
๐๐ข๐๐ โ๐๐๐ ๐๐๐ก๐๐ ๐๐๐๐โง
[Spring] ์์ธ ์ฒ๋ฆฌ ๋ณธ๋ฌธ
[Spring] ์์ธ ์ฒ๋ฆฌ
๐คRyusun๐ค 2023. 6. 30. 17:57์์ธ(Exception)
- ํ๋ก๊ทธ๋๋ฐ์์ ์์ธ(Exception)๋ ์ ๋ ฅ๊ฐ์ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ฐธ์กฐ๋ ๊ฐ์ด ์๋ชป๋ ๊ฒฝ์ฐ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ผ๋ก ๋์ํ์ง ๋ชปํ๋ ์ํฉ
- ์ฝ๋ ์ค๊ณ๋ฅผ ํตํด ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
์๋ฌ(Error)
- ์ฃผ๋ก ์๋ฐ์ ๊ฐ์๋จธ์ ์์ ๋ฐ์์ํค๋ ๊ฒ์ด๋ฏ๋ก ์์ธ์ ๋ฌ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ์ด ๊ฑฐ์ ์๋ค.
- ex) ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ(OutOfMemory), ์คํ ์ค๋ฒํ๋ก(StackOverFlow)
- ๋ฐ์ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ๋ฏธ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์๋ฐฉํด์ ์ฐจ๋จํด์ผํ๋ค.
์์ธ ํด๋์ค
- ๋ชจ๋ ์์ธ ํด๋์ค๋ Throwable ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค.
- Exceptionํด๋์ค๋ ๋ค์ํ ์์ ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ ํฌ๊ฒ ๋๊ฐ์ง๊ฐ ์๋ค.
- Checked Exception
- ์ปดํ์ผ ๋จ๊ณ์์ ํ์ธ ๊ฐ๋ฅํ ์์ธ ์ํฉ
- IDE์์ ์บ์นํด์ ๋ฐ๋์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ํ์ํด์ค๋ค.
- ๋ํ์ ์ธ ์์ธ ํด๋์ค
- IOException
- SQLException
- Unchecked Exception
- ๋ฐํ์ ๋จ๊ณ์์ ํ์ธ๋๋ ์์ธ ์ํฉ
- ๋ฌธ๋ฒ์ ๋ฌธ์ ๋ ์์ง๋ง ํ๋ก๊ทธ๋จ์ด ๋์ํ๋ ๋์ค ๋ฐ์ํ๋ ์์ธ๋ฅผ ์๋ฏธํ๋ค.
- ๋ํ์ ์ธ ์์ธ ํด๋์ค
- RuntimeException
- NullPointerException
- IllegalArgumentException
- IndexOutOfBoundException
- SystemException
- Checked Exception
์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
- ์์ธ๊ฐ ๋ฐ์ํ์๋ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ์์ธ ๋ณต๊ตฌ
- ์์ธ ์ํฉ์ ํ์ ํด์ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ์
- ๋ํ์ ์ธ ๋ฐฉ๋ฒ
- try/catch
- ์์ธ ์ฒ๋ฆฌ ํํผ
- ์์ธ๊ฐ ๋ฐ์ํ ์์ ์์ ๋ฐ๋ก ์ฒ๋ฆฌํ๋๊ฒ์ด ์๋๋ผ ์์ธ๊ฐ ๋ฐ์ํ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ณณ์์ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ์ ๊ฐํ๋ ๋ฐฉ์
- ๋ํ์ ์ธ ๋ฐฉ๋ฒ
- throw
- ์์ธ ์ ํ
- ์์ ๋ ๋ฐฉ์์ ์ ์ ํ๊ฒ ์์ ๋ฐฉ์(try/catch + throw)
- ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ๋๋์ ๋ฐ๋ผ ํธ์ถ๋ถ๋ก ์์ธ ๋ด์ฉ์ ์ ๋ฌํ๋ฉด์ ์ข ๋ ์ ํฉํ ์์ธ ํ์ ์ผ๋ก ์ ๋ฌ ํ ํ์๊ฐ ์์๋ ํ์ฉ.
- ์์ธ ๋ณต๊ตฌ
์คํ๋ง ๋ถํธ์์ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ์
- ์์ธ๊ฐ ๋ฐ์ํ์๋ ํด๋ผ์ด์ธํธ์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ๊ฐ ๋ ์ด์ด์์ ๋ฐ์ํ ์์ธ๋ฅผ ์๋ํฌ์ธํธ ๋ ๋ฒจ์ธ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌํด์ผ ํ๋ค.
- ์ด๋ ๊ฒ ์ ๋ฌ๋ฐ์ ์์ธ๋ฅผ ์คํ๋ง ๋ถํธ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ํฌ๊ฒ ๋๊ฐ์ง๊ฐ ์๋ค.
- @(Rest)ControllerAdvice์ @ExceptionHandler๋ฅผ ํตํด ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ์์ธ๋ฅผ ์ฒ๋ฆฌ
- @ControllerAdvice ๋์ @RestControllerAdvice๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ JSON ํํ๋ก ๋ฐํํ ์ ์๋ค.
- @ExceptionHandler ๋ฅผ ํตํด ํน์ ์ปจํธ๋กค๋ฌ์ ์์ธ๋ฅผ ์ฒ๋ฆฌ
- ๋ง์ฝ ์ปจํธ๋กค๋ฌ ๋๋ @controllerAdvice ํด๋์ค๋ด์์ ๋์ผํ ํธ๋ค๋ฌ ๋ฉ์๋๊ฐ ์ ์ธ๋ ์ํ์์ @ExceptionHandler(Exception.class) ์@ExceptionHandler(NullPointerException.class)๊ฐ ์คํ๋ ๊ฒฝ์ฐ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๊ฐ ์ง์ ๋ ์ชฝ(NullPointerException)์ด ์ฐ์ ์์๋ฅผ ๊ฐ๊ฒ๋๋ค.
- ๋ํ @ControllerAdvice์ ๊ธ๋ก๋ฒ ์์ธ ์ฒ๋ฆฌ์ @Controller ๋ด์ ์ปจํธ๋กค๋ฌ ์์ธ ์ฒ๋ฆฌ์ ๋์ผํ ํ์ ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ฉด ๋ฒ์๊ฐ ์ข์ ์ปจํธ๋กค๋ฌ์ ํธ๋ค๋ฌ ๋ฉ์๋๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ๊ฒ๋๋ค.
์ฌ์ฉ์ ์ ์ ์์ธ(์ปค์คํ ์์ธ)
- ํ์ค ์์ธ๋ฅผ ์ฌ์ฉํ ๋๋ ์์ธ ๋ฉ์์ง๋ฅผ ์์ธํ ์์ฑํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์ ์กด์ฌ.
- ์ฌ์ฉ์ ์ ์ ์์ธ๋ ํด๋์ค์ ์ด๋ฆ๋ง ๋ด๋ ์ง๊ด์ ์ผ๋ก ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ์ง์ ๊ฐ๋ฅํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์์ํด์ง๋ค.
- ๋ํ ์์ธ ์ํฉ์ ๋ํ ์ฒ๋ฆฌ๋ ์ฉ์ดํ๋ฐ ํ์ค ์์ธ๊ฐ ์๋ ๋ค๋ฅธ ์๋ฌ๋ค๋ ์ด๋์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ํ์ธํ๊ธฐ ์ฝ๋ค.
์ปค์คํ ์์ธ ํด๋์ค ์์ฑํ๊ธฐ
- ์ปค์คํ ์์ธ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ํด๋นํ๋ ์์ ์์ธ ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค.
- ์์ธ ํด๋์ค๋ฅผ ์์ฑํ๋๋ฐ ํ์ํ ๋ด์ฉ
- ์๋ฌ ํ์ (Error Type) : HttpStatus์ reasonPhrase
- ์๋ฌ ์ฝ๋(Error Code) : HttpStatus์ value
- ๋ฉ์์ง(Message) : ์ํฉ๋ณ ์์ธ ๋ฉ์์ง
์์ ์ฝ๋
๋จผ์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ ์ํฉ๋ณ ErrorCode๋ฅผ ์ ์ํ Enum ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
๊ทธ ๋ค์, ์์ธ ํด๋์ค์์ ์๋ ค์ฃผ๋ Exception ๋๋ RuntimeException ์ ์์๋ฐ์ AppException ํด๋์ค๋ฅผ ์ ์ํ๋ค. ์์ธ๋ฅผ ๊ฐ์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ Exception, ๋์จํ๊ฒ ์ ๋ณด๋ง ์ ๊ณตํ๊ณ ์ถ์ ๊ฒฝ์ฐ RuntimeException์ ์์ํ๋ค.
@AllArgsConstructor
@Getter
public enum ErrorCode {
USERMAIL_DUPLICATED(HttpStatus.CONFLICT, ""),
USERMAIL_NOT_FOUND(HttpStatus.NOT_FOUND, ""),
INVALID_PASSWORD(HttpStatus.UNAUTHORIZED, ""),
CART_NOT_FOUND(HttpStatus.NOT_FOUND, ""),
PRODUCT_NOT_FOUND(HttpStatus.NOT_FOUND, ""),
PAGE_INDEX_ZERO(HttpStatus.BAD_REQUEST, ""),
ORDER_NOT_FOUND(HttpStatus.NOT_FOUND, "");
private HttpStatus httpStatus;
private String message;
}
HttpStatus๋ฅผ ์ปค์คํ ์์ธ ํด๋์ค์ ํฌํจ์ํค๋ฉด ํธ๋ค๋ฌ ์์์ ์ ์ธํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์์ธ ํด๋์ค๋ง ์ ๋ฌ๋ฐ์ผ๋ฉด ๊ทธ ์์ ๋ด์ฉ์ด ํฌํจ๋ผ ์๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ ์ ์๋ค.
@AllArgsConstructor
@Getter
public class AppException extends RuntimeException{
private ErrorCode errorCode;
private String message;
}
package com.example.creditmarket.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class ExceptionManager {
@ExceptionHandler(AppException.class)
public ResponseEntity<?> appExceptionHandler(AppException e){
return ResponseEntity.status(e.getErrorCode().getHttpStatus())
.body(e.getErrorCode().name() + " " + e.getMessage());
}
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<?> runtimeExceptionHandler(RuntimeException e){
return ResponseEntity.status(HttpStatus.CONFLICT)
.body(e.getMessage());
}
}
- @RestControllerAdvice
- @Controller๋ @RestController์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ํ ๊ณณ์์ ๊ด๋ฆฌํ๊ณ ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ ๊ธฐ๋ฅ ์ํ
- basePackagesClasses, basePackages๋ฅผ ๋ณ๋๋ก ์ค์ ํ์ฌ ์์ธ๋ฅผ ๊ด์ ํ๋ ๋ฒ์๋ฅผ ์ง์ ํ ์ ๋ ์๋ค.
- basePackageClasses: ์ ์ฉ ํด๋์ค์๋ง ์ ์ฉ
- basePackages: ํ์ ํด๋์ค์ ๋ชจ๋ ์ ์ฉ
- @RestControllerAdvice(basePackageClasses = ProductController.class) // ํด๋น ํด๋์ค
- @RestControllerAdvice(basePackages = "com.example") // ์ง์ ํจํค์ง๋ด์ ๋ชจ๋ ์ ์ฉ
- @ExceptionHandler
- @Controller๋ @RestController๊ฐ ์ ์ฉ๋ ๋น์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ก์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
- ์ด๋ค ์์ธ ํด๋์ค๋ฅผ ์ฒ๋ฆฌํ ์ง๋ value ์์ฑ์ผ๋ก ๋ฑ๋กํ๋ฉฐ ์ฌ๋ฌ ์์ธ ํด๋์ค๋ฅผ ๋ฑ๋ก ํ ์๋ ์๋ค.
์ฐธ๊ณ
์คํ๋ง ๋ถํธ ํต์ฌ๊ฐ์ด๋ - ์ฅ์ ์ฐ
'๐ฃ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐บ๐ถ๐ป๐ด๐ป > ๐๐ฉ๐ซ๐ข๐ง๐ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] QueryDSL ๋ฌธ๋ฒ (0) | 2023.07.20 |
---|---|
[Spring] QueryDSL (0) | 2023.07.18 |
[Spring] RestTemplate, UriComponentsBuilder (0) | 2023.06.28 |
[Spring Batch] JobInstance, JobParameter, JobExecution, JobScope (0) | 2023.06.23 |
[Spring Batch] Tasklet, Chunk (0) | 2023.06.22 |