스프링
-
스프링 예외 추상화스프링/스프링 기초DB 2023. 3. 19. 17:00
예외가 발생했을 때 해당 예외를 그대로 반환하는 것이 아니라 런타임 예외를 따로 만들어서 해당 예외를 반환하는 것이 효율적이다. @Test void duplicateKeySave() { service.create("myId"); service.create("myId"); // 같은 아이디 저장 시도 } @Slf4j @RequiredArgsConstructor static class Service { private final Repository repository; public void create(String memberId) { try { repository.save(new Member(memberId, 0)); log.info("saveId={}", memberId); } catch (MYDuplic..
-
체크 예외, 언체크(런타임) 예외스프링/스프링 기초DB 2023. 3. 19. 14:41
체크 예외(Checked Exception) 체크 예외 : Exception 하위 예외 중 RuntimeException을 제외한 에외 - 체크 예외는 컴파일러가 예외를 체크하는 예외이다. 체크 예외 장점 - 컴파일 오류를 발생시켜 만약에 개발자가 예외처리를 제대로 하지 않았을 때 개발자가 알아차릴 수 있도록 도와준다. 체크 예외 단점 - 개발자가 크게 신경쓰고 싶지 않은 예외까지 반드시 잡거나 던지도록 처리해야 한다. static class MyCheckedException extends Exception { // Exception을 상속받으면 체크 예외 (RuntimeException은 언체크 예외) public MyCheckedException(String message) { super(messag..
-
DB 트랜잭션 - 자동 커밋, 수동 커밋 / DB 락스프링/스프링 기초DB 2023. 3. 14. 18:36
db에 데이터를 저장할 때 커밋이라는 용어가 있다. 데이터를 변경하고 나서 커밋을 해주면 db에 최종 저장이 되어서 다른 사용자가 볼 때에도 저장된 데이터를 볼 수 있다. 맨 위의 set autocommit true;는 자동 커밋으로 변경한다는 뜻인데, default 값이 자동 커밋이기 때문에 사실 생략해도 된다. 위 처럼 자동 커밋을 실행하면 oldId라는 데이터가 db에 저장되어서 다른 세션에서 접근해도 확인할 수 있다. 다음은 수동 커밋 모드이다. 수동 커밋 모드에서는 임시 저장을 하기 때문에 이것을 행한 세션에서는 보이지만 다른 세션에서는 member를 호출해도 볼 수 없다. 이러한 이유는 데이터를 저장할 때 여러 작업을 하나의 묶음으로 생각하기 위해서이다. 만약에 A가 B에게 계좌이체 5000원..
-
DB - 커넥션풀과 DataSource스프링/스프링 기초DB 2023. 3. 14. 16:54
우리가 지금까지 사용했던 서버들은 창을 닫으면 데이터가 날라간다. 그렇기 때문에 데이터베이스를 만들어서 데이터를 저장할 수 있는 공간을 따로 설정해야한다. Connection - 데이터베이스와 연결시켜주는 객체, getConnection을 통해 DB를 연결시켜줌 ResultSet - 쿼리의 결과를 담은 객체 Statement - 정적 쿼리를 전달 Preparedstatement - sql문을 전달 private void close(Connection con, Statement stmt, ResultSet rs) { JdbcUtils.closeResultSet(rs); JdbcUtils.closeStatement(stmt); JdbcUtils.closeConnection(con); // close는 생성과..
-
포맷터 - Formatter스프링/스프링 MVC 패턴 2023. 3. 7. 17:12
보통 문자 -> 다른 타입 혹은 다른 타입 -> 문자의 변환을 많이 사용한다. 스프링에서는 포맷터라는 문자의 자동 변환 기능을 제공한다. MyNumberFormatter.class @Slf4j public class MyNumberFormatter implements Formatter { // Number는 integer, double, long 등 숫자 형태 타입의 부모 @Override public Number parse(String text, Locale locale) throws ParseException { log.info("text={}, locale={}", text, locale); // "1,000" -> 1000 NumberFormat format = NumberFormat.getIns..
-
스프링 타입 컨버터스프링/스프링 MVC 패턴 2023. 3. 7. 15:14
반환 타입을 수정해야할 일이 있다. 스프링은 컨버터라는 변환기로 타입의 변환을 자동으로 시켜준다. 컨버터 직접 구현 @Getter @EqualsAndHashCode public class IpPort { private String ip; private int port; public IpPort(String ip, int port) { this.ip = ip; this.port = port; } } ipPort라는 타입을 만들어주고 stirng 타입에서 IpPort 타입으로 변경해 볼 것이다. @Slf4j public class StringToIntegerConverter implements Converter { @Override public Integer convert(String source) { lo..
-
스프링 API 예외처리 - @ExceptionHandler (대부분 쓰임)스프링/스프링 MVC 패턴 2023. 3. 5. 15:41
API 예외처리의 어려운 점 - 특정 컨트롤러에서만 발생하는 예외를 처리하기 어렵다. - 회원 처리하는 컨트롤러에서 발생한 RuntimeException 예외와 상품을 관리하는 컨트롤러에서 발생한 RuntimeException 예외를 서로 다른 방식으로 처리하고 싶다면?? 이러한 단점들을 보완하기 위해서 @ExceptionHanlder를 사용하면 된다. @Slf4j @RestController public class ApiExceptionV2Controller { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandler(IllegalArg..
-
API 예외처리 - 스프링 ExceptionResolver스프링/스프링 MVC 패턴 2023. 3. 5. 15:10
BadRequestException.class를 새로 생성했다. @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류") public class BadRequestException extends RuntimeException { } @ResponseStauts 애노테이션은 상태를 설정할 수 있게 도와주는 애노테이션이다. code = HttpStauts.BAD_REQUEST를 통해 400 에러로 변경시켰다. @GetMapping("/api/response-status-ex1") public String responseStatusEx1() { throw new BadRequestException(); } 컨트롤러에서 url을 매핑해주고 thr..