엔티티에서 @Builder 사용할 때 불변성에 대한 고찰
·
Java
엔티티에서@Builder를 사용해 보면서 생긴 문제점이 있다.엔티티는 불변성을 유지해줘야 한다는 점을 간과했다는 점이다.불변성이란?변경을 허용하지 않는 성질로불변성을 유지하는 객체란 변경 불가한 객체를 뜻한다. 불변객체는 객체를 생성 후 객체에 저장된 값을 수정하려고 시도한다면,값이 수정되는 것이 아닌 아예 새로운 객체가 생성되어 저장된다.예로 들면 문자열이 있다.String a = "hello"; // 불변객체String b = a.toUpperCase(); // a는 변하지 않고, 새 객체가 생성됨StringBuilder sb = new StringBuilder("hello"); // 가변객체sb.append(" world"); // 기존 객체 자체가 변경됨 @Setter는 가변객체에서 사용된다.Em..
[Spring Boot] Entity <-> DTO 변환 방법 4가지, Setter부터 @Builder, static Factory 메서드 패턴, 상속까지
·
Java
백엔드 개발의 핵심인 CRUD 기능 개발에서 데이터를 담는 두 가지 객체를 만나게 됩니다.바로 Entity와 DTO입니다.Entity는 DB와 직접 맞닿아 있는 내부 저장용 객체DTO는 프론트엔드와 데이터를 주고받는 외부 소통용 객체프론트에서 JSON형태로 요청을 보내면Spring은 이를 DTO로 변환해 받습니다. 하지만? DB에 저장하려면 이 DTO를 다시 Entity로 바꿔야 하고,반대로 DB데이터를 보내줄 땐 Entity를 DTO로 변환해야 합니다.이 '객체 변환'은 어떻게 하느냐에 따라 코드의 유지보수성이 달라집니다.오늘은 제가 공부했던 변환방법 4가지를 쉬운 순서대로 정리해보려 합니다.1. @Setter스프링 시작하면 바로 만나게 되는 @Setter와 @Getter @Setter는 아래와 같이 ..
카멜케이스와 스네이크케이스 언제 사용할까?
·
Java
카멜케이스(camelCase) vs 스네이크케이스(snake_case)스프링 부트에서 @Entity 클래스에서 @Column(name="emp_id")를 사용하는 이유?@Entitypublic class Emp { private Integer emp_id;}위와 같은 코드는 insert시 입력한 값 대신 null이 들어갑니다.그 이유를 알아보자. 데이터베이스는 컬럼명의 소문자와 대문자를 구별하지 않는다.그래서 첫글자를첫 글자를 소문자, 그 뒤 단어의 첫 글자를 대문자로 표기하는카멜 표기법(camelCase) 대신 언더바를 중간에 넣는 스네이크케이스(snake_Case)를 사용한다.ORM 매핑 방식 1번째)@Entitypublic class Emp { @Column(name = "emp_id")..
Spring Boot 버전 2 부터 자동화된 필터 기능들
·
Java
원래 input 태그에서 HTTP요청은 GET과 POST 요청만 가능했다.근데 HiddenHttpMethodFilter 로 config 설정을 한다면input 태그에서도 속성값을 활용해서 PUT 이나 DELETE 요청을 보낼 수 있었다. 아래는 @Configuration 클래스에 추가한 필터 메서드 예시이다.@BeanFilterRegistrationBean hiddenHttpMethodFilter( ) { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean( ); HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter( ); fi..
[Java] 날짜 타입(LocalDate, Date) 다루기, Servlet, Spring, Spring Boot
·
Java
자바 기반 프로젝트에서는 날짜 데이터를 다루는 일이 정말 많습니다.특히 Date나 LocalDate 같은 타입을 어떻게 저장하고 활용할지, 그리고 개발 환경이 발전하면서 이 방식이 어떻게 변해왔는지 비교해 보겠습니다.예시 상황)회사에 신입사원이 들어왔고, 그 사원의 입사일을 데이터베이스에 저장해야 한다고 가정해 봅시다.웹에서 넘어오는 HTTP 요청은 기본적으로 문자열입니다.따라서 DB에 저장하려면 스키마에 맞게 타입 변환을 거쳐야 합니다.날짜데이터를 다루는 두 가지 원칙)1. DB에 저장할 때는 날짜타입으로 저장한다.2. 뷰(View)로 보여줄 때는 상황에 맞게 문자열 or 날짜타입을 선택한다.이 두 가지 원칙을 기준으로, 세 가지 프로젝트 환경(서블릿/JSP → 스프링 레거시 → 스프링 부트)에서 어떻..
백준 1931번 회의실 지정,Java 풀이
·
Java
백준 1931번 문제 https://www.acmicpc.net/problem/19311. 내 방식대로 풀어보기import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[][] arr = new int[n][2]..