두 날짜 사이의 차이 구하기 (startDate, endDate) DateTimeFormatter DATE_FORMAT = new DateTimeFormatterBuilder() .appendPattern("uuuu-MM-dd HH:mm:ss") .toFormatter(); LocalDateTime startDateTime = LocalDateTime.parse(startDate, DATE_FORMAT); LocalDateTime endDateTime = LocalDateTime.parse(endDate, DATE_FORMAT); log.debug("차이 달: " + startDateTime.until(endDateTime,ChronoUnit.MONTHS)); if (startDateTime.until(..
mybatis 쿼리문 실행결과 컬럼(열) 순서를 고정 SELECT col1, col2, col3 FROM test 위 SELECT 해온 쿼리의 결과를 리스트로 받아올때, 리스트의 순서를 col1, col2, col3로 고정시키고 싶은 경우가 있다. 하지만 hashMap을 resultType으로 받는 위 결과를 보면 SELECT 컬럼 순서대로 조회되지 않는다. SELECT col1, col2, col3 FROM test 결과타입 resultType을 "java.util.LinkedHashMap" 으로 변경하면, SELECT 선언 컬럼 순서대로 데이터를 담을 수 있다.
String, StringBuffer, StringBuild 비교 String, StringBuffer, StringBuild 는 모두 문자열 관련 클래스이다. String은 불변함 (immutable) StringBuffer, StringBuilder는 변함 (mutable) String 객체의 불변함이 무슨뜻인지 알아보자. String test = "a"; CASE1. test += "b"; CASE2. test.concat("b"); 위 간단한 코드에서, test String 객체는 Hip 메모리 영역에 생성된다. 따라서 두번째 코드에서 += 또는 concat 메소드를 사용하였을때 생성되었던 처음 메모리가 아닌, 새로운 메모리를 생성한다. + 연산자, concat 메소드를 통해 새로 생성된 Stri..
정적 팩터리 메서드 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자 이다. 하지만 한가지 기법이 더 있다. 클래스는 생성자와 별도로 정적 팩터리 메서드 (static factory method)를 제공할 수 있다. 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드 말이다. public static Boolean test(boolean b) { return b ? Bollean.TRUE : Boolean.FALSE; } 클래스는 클라이언트에 public 생성자 대신 정적 팩터리 메서드를 제공할 수 있다. 정적 팩터리 메서드의 장점 1) 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객체의 특성을 제대로 설명하지 못한다. 정적 팩터리는 이름을 잘 지으..
Mybatis 실행결과 Return spring 프로젝트를 할때 serviceImpl에서 mappe파일을 호출하여 쿼리가 실행될때 이 쿼리로 인해 변경되거나 삽입되거나 삭제된 행의 개수를 가져올 수 있다. 1. count : insert된 개수가 리턴된다. int count = ExamMapper.insertUsers(); if (count < 1) { Log.info("변경사항 없음"); } 2. count : update된 개수가 리턴된다. int count = ExamMapper.updateUsers(userVO if (count < 1) { Log.info("변경사항 없음"); } 3. count : delete된 개수가 리턴된다. int count = ExamMapper.deleteUsers(i..
@RequestParam 필수값 제거 @RequestParam으로 파라미터를 받을때 값이 들어오지 않으면 에러가 발생한다. 필수값이 아닌경우 null 가능으로 지정해줄 수 있다. (required = false를 추가하자. default는 required = true이기 때문에 명시하지 않으면 필수값이 아닐 경우 에러가 발생한다. Before @RequestParam MultipartFile file After @RequestParam(required = false) MultipartFile file
상황 PathVariable으로 파라미터를 이메일형식 (ID@test.com) 으로 받을 경우 에러가 발생한다. controller에서 RequestMapping 또는 putMapping 등 url을 지정해줄때, 위 처럼 { }안의 파라미터를 사용할 수 있다. 이때 '.' 이 들어갈때 . 뒷부분이 짤려나가는 경우가 있다. 해결방안 @PutMapping("/register/{exam:.+}") public void exam(@PathVariable String exam) { } 예를들어 email이 exam@exam.com 이라고 하면, 위 url은 .../register/exam@exam 이 된다. 하지만 :.+ 을 써주면 모든 이메일이 파라미터로 들어오게 된다.
VO에서 데이터타입이 BigDecimal일때 default값을 지정 Before private BigDecimal deliveryFee; After private BigDecimal deliveryFee = new BigDecimal(0); 이런식으로 new 연산자를 사용하여 default 값을 0으로 지정해줄 수 있다.
휴대폰번호가 아닌 자유형식의 번호 정규표현식 @Pattern(regexp = "^[0-9-]{2,20}$")
특정 문자를 지정하여 해당 문자만 가능하도록 하는 정규표현식 ex) Y, N만 가능 @Pattern(regexp = "^[YN]$")
날짜 정규표현식 (YYYY-MM-DD) 의 정규식 표현 @Pattern(regexp = "^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$")
휴대폰번호 정규식 표현 ex) 000-1234-1234 또는 01012341234 @Pattern(regexp = "^01([0|1|6|7|8|9])-?([0-9]{3,4})-?([0-9]{4})$")
이메일 형식 (exam@exam.com) 의 정규식 표현 @Pattern(regexp = "^[A-Za-z0-9_\\.\\-]+@[A-Za-z0-9\\-]+\\.[A-Za-z0-9\\-]+$")
NULL 변환 함수 1. NVL 함수 NULL 값을 다른 값으로 변환할때 사용하며, 모든 데이터 타입에 사용할 수 있다. SELECT NVL(col1, 0) FROM exam exam 테이블의 컬럼 col1이 null이라면, 0을 출력한다. 2. NULLIF 함수 NULLIF(col1, col2) 컬럼 col1의 값과 컬럼 col2의 값이 동일하면 NULL을 출력하고, 동일하지않으면 col1의 값을 출력한다. 3. COALESCE COALESCE(col1, col2, col3, ...) col1, col2, col3... 중에서 순서대로 비교하여 null이 아닌 첫번째 값을 가져오고, 모두 null이면 0을 출력한다.
스프링의 빈 오브젝트 스프링의 애플리케이션 컨텍스트는 IoC 컨테이너로써, 싱글톤을 저장하고 관리하는 싱글톤 레지스트리이다. 스프링은 여러 번에 걸쳐 빈을 요청하더라도 매번 동일한 오브젝트를 돌려준다. getBean() 메소드를 실행할 때마다 같은 오브젝트를 돌려준다. 스프링은 기본적으로 별다른 설정을 하지않으면, 내부에서 생성하는 빈 오브젝트를 모두 싱글톤으로 만든다. 왜 스프링은 싱글톤으로 빈을 만들까? 스프링이 주로 적용되는 대상은 자바 엔터프라이즈 서버환경이다. 자바 엔터프라이즈 서버환경이란, 서버 하나당 최대로 초당 수십에서 수백번씩 브라우저나 다른 시스템으로부터의 요청을 받아 처리할 수 있는 높은 성능이 요구되는 환경이다. 만약 매번 클라이언트에서 요청이 올때마다 각 로직을 담당하는 오브젝트를..