본문 바로가기

Spring

(71)
Spring Jdbc로 mysql datetime 타입의 데이터 넣기 결론부터 이야기 하자면 Jdbc로 MySql의 Datetime타입에 값을 넣을 때 LocalDateTime을 이용하고 db에 insert할 때는 Timestamp로 바꿔서 합니다. 위 table의 created_at이 MySql datetime 타입 입니다. public class CarModel { private int id; private String name; private int level; private LocalDateTime createdAt; } Model은 LocalDateTime으로 했습니다. public void add(CarModel carModel) throws SQLException { this.jdbcContext.workWithStatementStrategy(new State..
Java Enum 쓰는 법 Enum은 enumeration 에서 앞에 4글자 입니다. 보통 열거형이라고 번역 되어 있습니다. 어플리케이션이 복잡해지다 보면 에러가 날 가능성도 올라가는데 넣을 수 있는 값들을 Enum에 미리 지정 해놓고 그 값 말고 다른 값들을 넣지 못하게 하여 에러를 방지하는 목적으로 사용 합니다. 예를들면 계절은 4계절 뿐이고 요일도 월~일이렇게 7일뿐입니다. 그래서 이 밖에 값들을 입력 할 수 없게 미리 정해 놓는 것입니다. public enum Season { 봄(1), 여름(2), 가을(3), 겨울(4); private final int value; Season(int value) { this.value = value; } } 보통은 위와 같이 사용 합니다. public enum Season1 { 봄, 여..
토비의스프링3 JdbcTemplate의 queryForObject 토비의 스프링3를 따라하면서 Spring버젼이 올라가면서 바뀐부분이 있어서 정리해서 올려놓습니다. 3장 Template queryForInt --> queryForObject 토비의스프링3를 따라하다가 JdbcContext를 JdbcTemplate으로 바꿔주는 구간에서 책이 오래 되었기 때문에 스프링을 최신버젼(저는 5버젼)을 쓰면 따라하기 힘든 구간이 나옵니다. public int getCount() throws SQLException { StatementStrategy st = new StatementStrategy() { @Override public PreparedStatement makePreparedStatement(Connection c) throws SQLException { Prepare..
토비의 스프링3 JdbcContext만들기 Context는 '맥락'이라는 뜻 입니다. 여기에서 context는 JDBC를 이용해 DB를 업데이트 한다는 변하지 않는 맥락이 있습니다. 맥락은 스타벅스에서 커피를 주문 하는 것과 비유를 해보면 1.고객은 스타벅스 직원에게 메뉴들을 주문하고 2.직원은 전체 얼마인지 계산을 해서 고객에게 알려주고 3.고객은 결제를 하고 4.주문한 메뉴들이 만들어 지면 받아가는 맥락입니다. 여기에서 핵심 메소드는 executeSql입니다. executeSql은 Sql문을 받아서 실행을 해주는 역할을 하고 있습니다. public class JdbcContext JdbcContext클래스는 DataSource를 외부에서 받아주는 기능이 있고 executeSql은 workWithStatementStrategy에 Prepared..
스프링 부트 @RequiredArgsConstructor 애노테이션 @Slf4j @Controller @RequestMapping("/api/v1/data/invalid_request/") @RequiredArgsConstructor public class InvalidRequestController { private final InvalidRequestService invalidRequestService;필드 DI를 제발좀 쓰지 말라고 하도 뭐라고 해서 컨스트럭터 di로 바꾸고 있는데 final로 선언을 해주면 그 부분을 자동화 해주는 애노테이션이 있다는 것을 알게 되었습니다. 위와 같이 씁니다. 그러면 @Autowired도 안써도 돼고 constractor도 없어도 됩니다. 그런데 final을 꼭 붙여야 합니다. 안그러면 null나와욤
jpa app 운영 배포 전략 jpa app 운영 배포 전략 jpa로 앱을 만들고 백엔드 서버를 운영 할 때 db에 컬럼이 추가 되는 경우가 있습니다. jpa같은 경우는 서버가 뜰 때 db하고 entity하고 매핑을 한 다음에 뜹니다. 예를들면 entity에 phone이라는 필드가 있지만 db에는 없는 경우는 매핑이 되지 않아서 서버가 뜨지 않습니다. 그래서 jpa에는 hibernate.ddl-auto에 update라는 옵션이 있는데 prod에는 보통 update는 해놓지 않고 validate로 해놓습니다. 이 옵션을 update로 해놓고 수정한 서버를 재부팅 하면 entity하고 db의 field와 비교를 해서 db의 field에 alter를 해서 컬럼을 추가합니다. 왠지 이야기만 들어도 문제가 생길 것 같지 않으신가요? 컬럼이 추..
WebFlux test get, get with param, post, post with param Parameter 2개 이상 보내기 @RestController @RequestMapping(value = "/api/v1/order") public class DistributeController { // http://localhost:8080/api/v1/order/distribute?id=1111&name=krk 이렇게 요청한다. @GetMapping(value = "/distribute") public String getOrder(@RequestParam int id, @RequestParam String name) { System.out.println(id); System.out.println(name); }결과 1111 krkTransferController.java @Slf4j @RestCo..
Optional .orElseThrow(Function) 사용법 개요 값이 없다면 에러가 나게 코드를 짜는 패턴은 흔하게 등장합니다. 에러를 나게 할 때마다 if조건을 넣어서 특정 조건일때 혹은 아닐때 에러가 나게 한다면 에러처리가 귀찮고 잘 안하게 됩니다. 하지만 orElseThrow()를 쓴다면 이 작업이 조금 편해져서 에러에 대해 생각할 시간과 인내심을 확보 할 수 있습니다. 아래 orElseThrow()를 쓰는 경우와 안쓰는 경우를 비교해보시기 바랍니다. orElseThrow()쓰는 경우 import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Stack; public class StTest { public static String get() thr..