JAVA 52

Enum, EnumSet, EnumMap

Enum enum은 열거형 상수를 의미합니다. public enum Status { START("0001"), RUNNING("0005"), FINISH("9000") ; private String code; Status(String code) { this.code = code; } } Enum을 사용했을 때 좋은 점. 1. 단순 String(원시) 비교가 아니고 Enum 타입으로 비교하기 때문에, 코드의 안전성을 높일 수 있습니다. 2. 허용가능한 값을 제한할 수 있습니다. 3. Enum 클래스 안에 상수를 선언하는 것이기 때문에, PREFIX를 줄일 수 있습니다. (ex. STATUS_START = "0001", STATUS_FINISH = "0005") 4. Enum 클래스 안에 메소드를 선언하여,..

JAVA/JAVA 2023.07.11

쓰레드로컬 Thread Local (데이터 경합 방지)

정의 쓰레드별 데이터를 보관하는 전용보관소, 쓰레드별 데이터 경합을 방지해준다. 사용법 // 값 선언 ThreadLocal threadLocalValue = new ThreadLocal(); // 값 저장 threadLocalValue.set(1); // 값 조회 threadLocalValue.get(); // 값 제거 threadLocalValue.remove(); 예시 // 쓰레드 로컬을 사용하는 서비스 만들기 public class ThreadLocalService { private ThreadLocal context = new ThreadLocal(); public String begin(String value) { context.set(value) return context.get(); } pu..

JAVA/Spring 2023.07.08

[Querydsl] fetch 결과 조회

Method Return Type Description fetch() List 여러건 조회 fetchOne() T 단건 조회 결과가 없으면 null, 결과가 여러 건이면 NonUniqueResultException 발생 fetchFirst() T 조회된 여러건 중 첫번째 값을 조회 (limit 1) 결과가 없으면 null 반환 fecthCount() long 조회된 건 수 반환 fetchResults() QueryResults 페이징 정보를 포함한 QueryResults 형태로 반환 fetch [ example ] import static study.querydsl.entity.QMember.*; @PersistenceContext EntityManager em; JPAQueryFactory queryF..

JAVA/JPA 2022.03.25

기본키 생성 전략 @GeneratedValue

@Id @Entity에 기본키 칼럼을 선언하려면 @Id를 사용합니다. 기본키를 직접 할당하려면 @Id만 적어준 뒤 코드에서 직접 set을 해주면 됩니다. 데이터베이스에서 자동으로 생성하게 하려면 @GeneratedValue를 사용해야 합니다. @GeneratedValue는 IDENTITY, SEQUENCE, TABLE 3가지 방식이 있습니다. 원하는 방식을 @GenerateValue의 strategy 속성으로 입력해줍니다. strategy 속성을 적지 않고 @GeneratedValue만 쓰면 GenerationType.AUTO가 적용되고, JPA에서 데이터베이스에 맞는 자동생성 전략을 선택합니다. (MYSQL은 IDENTITY, 오라클은 SEQUENCE) @Entity public class Custom..

JAVA/JPA 2022.02.11

I/O

I/O (input / output) 데이터 입출력 데이터가 들어오는 것 (Input)과 데이터가 나가는 것(Output)을 합쳐 I/O라고 합니다. 자바에서는 스트림, 채널, 버퍼 등을 통해 데이터 입출력이 가능합니다. Stream 스트림 스트림은 물이 한 방향으로 흘러가는 것처럼 단방향으로만 데이터 전송이 가능합니다. (입력과 출력 하나만 가능) 예를 들어 파일의 데이터를 읽고 저장하는 작업을 모두 수행해야 한다면, File Input Stream과 File Output Stream을 2개를 생성해야 합니다. 스트림은 바이트 스트림(Byte Stream)과 문자 스트림(Character Stream)으로 구분됩니다. 바이트 스트림 : 그림, 멀티미디어, 문자 등 모든 종류의 데이터 입출력이 가능함. ..

JAVA/JAVA 2022.02.06

[DDD] 아키텍처 계층과 도메인 구성 요소

아키텍처 계층(Layerd Architecture) 표현 영역 (User Interface Layer) 사용자의 요청을 응용 영역에 전달하고, 처리 결과를 다시 사용자에게 전달하는 역할을 하는 영역입니다. MVC 모델에서 View에 해당합니다. 응용 영역 (Application Layer) 사용자가 사용할 기능을 구현한 영역으로, 도메인 영역의 도메일 모델을 사용합니다. 도메인 영역(Domain Layer) 도메인 모델을 구현한 영역입니다. (핵심 비즈니스 기능을 구현한 영역입니다.) 인프라 영역 (Infrastructure Layer) DB 접근, 메세지 전송 등 기술을 구현한 영역입니다. DIP (Dependency Injection Princple) 아키텍처 계층구조는 상위 계층이 하위 계층에 의존..

JAVA/Architecture 2022.02.02

[DDD] Entity와 Value Object

Entity 엔티티는 식별자(identity)를 가지는 객체(Object)입니다. 예를 들어 도서는 ISBN을 식별자로 같은 Entity가 될 수 있습니다. 엔티티는 식별자를 갖기 때문에, Equals 비교에서 식별자가 값이 같으면 같은 객체로 인식합니다. 엔티티는 데이터 변경 이력을 관리하는 대상입니다. 즉 시간이 지남에 따라 정보를 추적할 수 있는 객체입니다. 식별자 생성 방법 채번 규칙 날짜값+일련번호와 같이 정해진 규칙에 따라 식별자를 만드는 방식 UUID(Universally unique identifier) java.util.UUID 클래스를 이용해서 식별자를 만드는 방식 직접 입력 회원 ID나 전화번호, 이메일 등과 같이 사용자가 입력하는 방식 일련번호 DB의 auto_increment 칼럼..

JAVA/Architecture 2022.01.30

@RequestMapping 과 @Controller

@RequestMapping @Controller @RequestMapping("sample") public class SampleController { @RequestMapping("/process") public ModelAndView process() { return new ModelAndView("view"); } } @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) @RequestMapping이 클래스에 붙은 경우 HandlerMapping에서 매핑정보로 인식합니다. 예를 들어 /sample URL로 요청이 오면 SampleController를 호출합니다. @RequestMapping이 메소드에 붙은 경우 @RequestMappi..

JAVA/Spring 2022.01.26

Spring MVC 구조

1. MVC 패턴 MVC 패턴이란, Model - View - Controller로 이루어진 구조를 말합니다. 애플리케이션(프로그램)을 데이터 영역, 비즈니스 영역, UI 영역으로 역할을 나누어 관리하는 것을 말합니다. 모델(Model) 데이터를 관리하는 역할을 담당하는 객체입니다. 데이터를 담아서 화면에 전달하는 역할을 합니다. 모델을 사용하면, 화면은 비즈니스 로직, 데이터 접근 방법을 몰라도 되기 때문에, 화면 구현에만 집중할 수 있습니다. 뷰(View) 화면을 렌더링하는, UI 영역을 담당하는 객체입니다. HTML 파일을 만들어 웹 브라우저에서 접근할 수 있도록 해줍니다. 컨트롤러(Controller) 비즈니스 영역을 담당하는 객체입니다. 요청을 받아 비즈니스 로직을 처리한 뒤, 결과를 모델에 담..

JAVA/Spring 2022.01.23