์๋ฒ๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ด์ ์ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ถ๋ฆฌํด์ฃผ๋ ์์
์ ์ํํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด ๋ก์ปฌ ๋๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ , ์ด์ ํ๊ฒฝ์์๋ MySQL์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ๊ฐ๊ฐ DB๋ฅผ ๋ค๋ฅด๊ฒ ์ง์ ํด์ค ์ ์๋ค.
๋ํ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ DB ์ ๊ทผ ํจ์ค์๋๋ฅผ ๊ณต๊ฐํ๊ณ ์ด์ ํ๊ฒฝ์์๋ ๋น๊ณต๊ฐ๋ก ์ง์ ํ ์๋ ์๋ค.
์ด์ฒ๋ผ ๊ฐ๊ฐ์ ํ๊ฒฝ์ ๋ฐ๋ผ ์ค์ ์ ๋ค๋ฅด๊ฒ ํ๋ ๊ฒ์ ํ๊ฒฝ ๋ณ์ ๋ถ๋ฆฌ๋ผ๊ณ ํ๋ค.
ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ๊ธฐ ์ํด์๋ CORS(Cross-Origin Resource Sharing)๋ฅผ ์ธํ
ํด์ผ ํ๋ค.
๋๋ ๋ค์๊ณผ ๊ฐ์ด WebMvcConfigurer ํด๋์ค๋ฅผ ์์ ๋ฐ์ CORS๋ฅผ ์ธํ
ํ๋ค.
public class WebConfig implements WebMvcConfigurer {
private static final int MAX_AGE_SEC = 3600;
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // CORS๋ฅผ ์ ์ฉํ URL ํจํด ์ ์
.allowedOrigins("*") // ์์ ๊ณต์ ๋ฅผ ํ์ฉํ Origin ์ง์
.allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE") //ํ์ฉํ HTTP method ์ง์
.maxAge(MAX_AGE_SEC); // 3000sec ๋งํผ pre-flight ์์ฒญ์ ๋ํ ์๋ต์ ๋ธ๋ผ์ฐ์ ์์ ์บ์ฑ
}
}
์ง์ ๋ง๋ ์ปค์คํ
์์ธ, @Valid์ ๋ํ ์์ธ ๋ฟ๋ง ์๋๋ผ ์์์น ๋ชปํ ๊ณณ์์ ์์ธ๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
์ด ๊ฒฝ์ฐ ๊ณตํต์ ์ผ๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ์ํํด์ฃผ์ด์ผ ํ๋ค.
๋๋ ๋ชจ๋ ์์ธ์ ์ต์์ ํด๋์ค์ธ Throwable์ ๋ํ ExceptionHandler๋ฅผ ๋ง๋ค์ด ์์์น ๋ชปํ ์ด๋ ํ ์์ธ๊ฐ ํฐ์ง๋๋ผ๋ ํด๋น ๋ฉ์๋๊ฐ ์คํ๋๋๋ก ํ๋ค.
@ExceptionHandler(Throwable.class)
public ResponseEntity<ErrorResult> handleGlobalException(Throwable e) {
ErrorResult errorResult = new ErrorResult(INTERNAL_SERVER_ERROR.getHttpStatus(), INTERNAL_SERVER_ERROR.getMessage());
return new ResponseEntity<>(errorResult, errorResult.getHttpStatus());
}
AWS์ Elastic Beanstalk๋ฅผ ํ์ฉํ ์๋น์ค ๋ฐฐํฌ๋ ์งํํ๋ค๊ฐ ์๋ฌ๊ฐ ๊ณ์ํด์ ๋ฐ์ํด ์ค๋จํ๋ค.
AWS์ ๋ํ ๊ฐ๋
์ ๋ ๊ณต๋ถํ๊ณ ๋ค์ ๋ฐฐํฌํด๋ด์ผ๊ฒ ๋ค.