일급 컬렉션 First-Class Collection일급 컬렉션은 컬렉션을 하나의 클래스로 감싸고 컬렉션 자체를 하나의 객체로 다루는 것을 의미한다. 즉 클래스에 컬렉션만 필드로 하나를 가지는 것! 일급(First-Class)이라는 용어는1.컬렉션을 단일 객체로 취급하고,2.컬렉션을 사용한 비즈니스 로직 관리와 데이터 무결성을 지키려는 의도를 가지고 있다. 일급 컬렉션을 사용하는 이유1. 책임 분리컬렉션과 관련된 로직을 일급 컬렉션 내부로 캡슐화해서 데이터 관련된 로직을 한곳에서 관리할 수 있다.컬렉션과 관련된 로직을 일급 컬렉션에 위임할 수 있게 된다. 학생 데이터를 가지는 Student 클래스가 있다고 가정하자.이 때, 전체 학생을 관리하기 위해서 학생 리스트 컬렉션을 만들 수 있다. 그렇다면 전체 ..
Java annotationProcessor annotation processor는 Java에서 주석(annotation)을 처리하기 위한 툴이다. 자바 컴파일러 플러그인의 일종으로, 컴파일 타임에 어노테이션에 대한 코드베이스를 검사, 수정, 생성하는 역할을 한다. 즉, 어노테이션을 사용하기 위해서는 어노테이션 프로세서가 필요하다. Annotation Processor를 사용하는 과정 1. 사용자는 코드 내에서 주석(annotations)을 사용한다. 이후 사용자는 자바 컴파일러(javac)로 코드를 컴파일하게 된다. 2. 구현: 컴파일러는 소스 코드 내의 어노테이션과 그에 해당하는 어노테이션 프로세서를 찾아 매칭한다. 이를 통해 해당 어노테이션을 처리할 수 있는 어노테이션 프로세서를 실행하게 된다. 주..
stream 의 map map 함수는 Java의 Stream API에서 제공하는 메소드, stream의 각 요소에 주어진 함수를 적용한 후 결과를 새로운 stream으로 반환한다. 기존에 있던 댓글을 가져와서 새로운 댓글로 업데이트 하는 과정을 의식의 흐름대로 작성해보니 이러했다. @Transactional public Comment update(Long commentId, CommentDto request) { // 변경하기전 댓글 객체 조회 Comment original = commentRepository.findById(commentId) .orElseThrow(() -> new BusinessException(ErrorCode.COMMENT_DOES_NOT_EXISTS)); Comment comm..
캡슐화 해서 객체 생성하는 디자인 패턴 객체를 생성하는 대신 객체의 인스턴스를 반환한다. 생성자를 직접 사용하는 것을 제한할 수 있다. 정적 팩토리 메서드(Static Factory Method)란? 정적(static). 팩토리(factory). 메서드(method) 정적 팩토리 메서드란 객체 생성을 담당하는 정적 메서드라는 의미를 가진다. 생성자 대신에 메서드로 객체를 생성하는 방식이다. 정적 팩토리 메서드를 사용하면 좋은 이유? 1. 이름을 지정해서 코드의 가독성이 높아진다. 정적 팩토리 메서드는 목적에 맞게 명확한 이름을 직접 지정할 수 있다. 반면에 생성자는 클래스 이름만 사용하기 때문에, 동일한 클래스에 여러 생성자가 있는 경우 구분하기 어렵다. public class Drink { privat..
kotlin 함수 ?.null { it } where 조건 안에서 특정 파라미터 값을 체크해 데이터 유무에 따라 사용할 수 있다. fun findByIdAndName(id: Long, name:String): List { return from(members) .where(members.id.eq(id), name?.let { members.name.eq(it) }) .fetch() } 코틀린에서 제공하는 함수를 queryDsl 쿼리문 안에서도 사용 가능하다. ?. : null 이 아닐 때 let { } : it 으로 자기 자신을 받아와서 객체의 상태를 변경할 수 있다. ?.let { null이 아닐 때 블럭을 실행한다. }
Enum 클래스를 만들고, Entity의 해당하는 컬럼을 Enum클래스로 type 변경 enum class BookType { COMPUTER, ECONOMY, SOCIETY, LANGUAGE, SCIENCE, } //val type: String, val type: BookType, 컬럼에 Enum 타입을 지정해주지 않으면? 디비에 0, 1, 2,... 처럼 순서대로 숫자 데이터가 들어간다. 문제점 1. 기존 Enum 의 순서가 바뀌면 치명적인 오류가 발생할 수 있다.! 2. 기존 Enum 타입의 삭제, 추가가 제한적이라 유지보수에 좋지 못하다. @Enumerated(EnumType.STRING) 타입을 지정하면, (여기서는 STRING 으로 지정한다.) 지정된 타입으로 Enum class의 데이터가 ..
@Entity class User( var name: String, ) { fun updateName(name: String) { this.name = name } } - 생성자 안의 var property 로 name 생성 - setter 대신 함수를 만들어 update name (var property) name setter가 public 으로 열려있지만, 함수를 이용하는 것이 클린하다. 이유? 1. 함수의 이름으로 명시적으로 사용 가능 2. 여러가지 property를 한번에 업데이트 가능 setter를 private하게 만드는 법 1. backing property (_name) class User( private var _name: String ) { val name: String get() = ..
각각의 테스트를 실행하면 성공하지만, 전체 테스트를 돌리면 실패하는 이유? : Spring Context 를 공유하기 때문 //Expected size: 2 but was: 3 in: //[com.group.libraryapp.dto.user.response.UserResponse@69862a1, // com.group.libraryapp.dto.user.response.UserResponse@585718dd, // com.group.libraryapp.dto.user.response.UserResponse@5a644d75] //java.lang.AssertionError: 생성 테스트 - 조회 테스트 1. 최초 생성 테스트 : DB에 user 데이터 1명 추가 @Test fun saveUserTest(..
- Total
- Today
- Yesterday
- 추상클래스
- dto 클래스 생성자
- Linux
- 스프링 스케줄링
- jvm warm-up 전략
- checkout
- 스프링오류
- n+1
- redisson 분산락
- JPA
- spring boot 3
- Cannot construct instance of
- Spring Security
- Kotlin
- MultipleBagFetchException
- junit5
- port
- addFilterBefore
- Git
- MongoDB
- FetchJoin
- bucket4j
- QueryDSL
- 배열
- Java
- 티스토리챌린지
- 오블완
- 자바 어플리케이션 실행 과정
- array
- ChatGPT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |