본문 바로가기

MimetypesFileTypeMap 첨부파일의 타입을 체크해야 할 때 해당 파일의 MimeType 을 살펴보면 어떤 파일인지 알 수 있는데, png 이미지 파일의 MimeType 이 image/png 이 아닌 application/octet-stream 로 넘어오는 현상을 발견했다. new MimetypesFileTypeMap().getContentType(filename); 위와 비슷하게 MimetypesFileTypeMap() 을 사용했는데 이 메소드는 주어진 파일의 확장자를 이용하여 MimeType 을 확인하기 위해 사용자 시스템에서 다음의 순서로 mime.types 파일을 찾는다. 프로그래밍 방식으로 MimetypesFileTypeMap 인스턴스에 항목 추가사용자의 홈 디렉토리에 있는 .mime.types/lib/mime.types..
DAO Pattern DAO(Data Access Object) 디자인 패턴은 비즈니스 계층에서 퍼시스턴스 계층을 분리하는데 사용되는 구조적 패턴이다. 쉽게말해 퍼시스턴스(Persistence) 계층... DB 의 데이터 처리(CRUD) 부분을 분리하여 계층간에 복잡성을 숨기는데 필요하다.이 때 필요한건 세가지 이다.Model Object : DAO 클래스에서 검색된 데이터를 저장하는 get/set 메소드가 포함된 간단한 POJO 이다. (Damain Class / Value Object 라고도 함.)DAO Interface : 모델 객체에서 수행할 표준 연산을 정의한다.DAO Class : 인터페이스를 구현한 클래스로서 DataSource 에서 데이터를 가져와야 한다.아래 예는 학번과 이름으로 학생들을 관리하는 프로그램 예..
Integer vs int Integer 와 int 이 둘의 차이를 흘려넘겼다가는 예상치 못한 곳에서 시간 낭비를 할 수도 있다.기능1. Integer : int 의 랩퍼 클래스로 산술 연산이 불가능하고, null 로 초기화가 가능하다. int를 처리 할 때 유용한 상수 및 메소드를 제공한다.2. int : 원시 자료형으로 산술 연산이 가능하고, 키워드로 쓰이며 null 로 초기화 할 수 없다.상호 변환 1. Boxing : Integer integer = new Integer(i);2. Unboxing : int i = integer.intValue();문자열 변환1. String -> Integer : Integer.valueOf(String)2. String -> int : Integer.parseInt(String)사이즈1..
Built-in annotations 자바 소스 코드에서 @Override 처럼 @ 기호를 앞에 붙인 메타데이터 형태를 어노테이션(annotation) 이라고 하며 Java5 에서 추가되었다.한글로 번역하면 comment 와 같은 '주석' 이 될 수 있지만 이 어노테이션은 단순한 주석이 아닌 메타 데이터의 일종으로 데이터의 데이터를 정의할 수 있다.소스 코드에서 클래스, 메소드, 변수, 매개 변수, 패키지 등에 사용되어, 클래스가 컴파일되거나 실행될 때 어노테이션에 설정된 값에 따라 클래스의 방향이 결정된다.컴파일러에 의해 생성된 클래스 파일의 어노테이션은 리플렉션(reflection) 을 통해 동작하게 된다.자바 코드에 적용되는 내장 어노테이션@Override - 메소드가 재정의(override) 된 것인지 확인한다. 부모 클래스나 구현된..
Error Handling Spring MVC 에서는 기본 error 페이지를 제공하지 않아 SimpleMappingExceptionResolver 를 사용해야 하지만, Spring Boot 는 기본적으로 BasicErrorController 를 설정하여 모든 error 를 처리하는 /error 매핑을 제공하며, 서블릿 컨테이너에 전역 error 페이지로 등록된다. 예로, Thymeleaf 를 사용할 경우 /error 와 매핑되는 페이지는 src/main/resources/templates/error.html 가 될 것이다.시스템 클라이언트의 경우, HTTP 상태, error, 메시지를 담은 JSON 형식으로 응답한다. 브라우저 클라이언트의 경우, 위와 동일한 데이터를 HTML 형식으로 렌더링한 /error 페이지로 응답할 것이며..
Type-safe Configuration Properties @Value 대신에 속성들의 타입을 명시하여 아래와 같이 @ConfigurationProperties 를 선언할 수 있다.아래는 @ConfigurationProperties 로부터 사용자 메타데이터 파일을 쉽게 생성할 수 있도록 spring-boot-configuration-processor 종속성을 가져와서 properties 작성, getter/setter 정의, getter 를 사용하는 순으로 properties 의 속성값을 가져오는 예이다.- propertiesacme.enabled=falseacme.remote-address=192.168.1.234...acme.security.username=abcacme.security.password=efg...cs- build.gradledependenc..
Spring properties Spring Boot 사용시 특정 속성들을 별도로 만들어(외부화) 다른 환경에서도 동일하게 코딩을 할 수 있다.일반적으로 공통적으로 사용되는 속성들을 정의하거나, 개발 환경(prod/dev) 등을 구분하고자 할 때 주로 사용된다.그 방법으로 properties 파일이나, YAML 파일, 환경변수 및 명령행 인수 등을 사용할 수 있으며, 워낙 다양한 방법들이 있다보니 중복되거나 하는 속성 값들에는 PropertySource 우선 순위가 작용한다.~/.spring-boot-devtools.properties (devtools가 활성화시)@TestPropertySource (테스트시)@SpringBootTest (테스트시)Command line 파라미터SPRING_APPLICATION_JSON 속성 (환경 변..
Spring Boot Devtools devtools 는 이름처럼 어플리케이션 개발시 유용한 기능들을 포함하고 있는 Spring Boot 모듈이다.개발 도중 결과를 확인하기 위해 build 를 수동으로 실행하고 브라우저를 새로고침 하여 결과를 확인하는 동작을 자동화하는 것이 특히 유용하다.gradle 에서 devtools 를 사용하려면 dependency 에 아래처럼 한 줄만 추가한다.dependencies { developmentOnly("org.springframework.boot:spring-boot-devtools")}Colored by Color Scriptercs그리고 IDE 마다 설정이 약간씩 틀린데 어플리케이션 실행 중 자동 빌드에 관련한 옵션을 설정한다. (아래: Intellij)File -> Settings [Ctrl-Al..