생성자
생성자는 간단하게 얘기하면 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다.
따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다.
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다. void 또한 사용하지 않는다.
- 생성자는 몇 가지 특징을 제외하면 메소드와 다르지 않다.
- 생성자는 메소드 처럼 클래스 내에 선언되고, 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
JPA, JPA와 SQL mapper의 차이
JPA : (Java Persistence Api)의 약자로 자바 언어를 기반으로 한 ORM입니다.
이는 객체와 관계형 데이터베이스 간의 매핑을 처리해주며 개발자가 객체를 생성하고 관리하면 JPA가 자동으로
SQL쿼리를 생성하여 DB에 접근하고 결과를 return해줍니다.
JPA는 객체를 기반으로 하기 때문에 객체 간의 관계를 자동으로 매핑해주고 DB에 대한 이해가 높지 않아도 사용하 기 편리하다는 장점이 있습니
SQL mapper : JPA와는 다르게 개발자가 직접 DB에 접근하여 SQL쿼리를 작성하여 통신합니다.
SQL mapper는 개발자와 DB가 밀접한 관계를 유지해야하기 때문에 DB에 높은 이해도를 요구합니다.
관계형 DB
관계형 데이터베이스는 테이블의 형태로 데이터들을 관리하면서 테이블끼리의 관계를 맺을 수 있는 DB 종류입니다.
이는 ACID라는 트랜잭션 기능을 제공하여 일관성과 안전성을 보장합니다.
ACID
- Atomicity (원자성) : 한 트랜잭션에서의 수행이 전부 성공했다면 성공, 아닐시 실패
- Consistency (일관성) : 트랜잭션을 수행하기 이전과 후의 DB상태는 유효해야한다.
- Isolation (격리성, 고립성) : 모든 트랜잭션은 다른 트랜잭션에 독립이다.
- Durability (지속성) : 트랜잭션이 성공했을 시 그 기록은 로그에 남아야한다.
Entity에서 기본 생성자는 왜 필요한가?
JPA가 Entity 객체를 생성할때 기본 생성자를 사용하여 객체를 생성하기 때문이다.
기본 생성자가 없으면 JPA가 Entity를 생성하지 못하고 오류가 나게 된다.
JPA에서 엔티티를 생성할 때 생성자를 사용하는데, 생성자를 추가하면 기본 생성자가 자동으로 생성되지 않습니다. 따라서, 기본 생성자를 추가해주어야 합니다.
JPA가 객체를 생성할 때는 리플렉션을 사용하는데 리플렉션이란 객체의 정보를 분석하여 동적으로 객체를 생성하고
메서드를 호출 할 수 있는 기능을 제공한다.
이를 통해 JPA는 Entity 클래스의 객체를 생성하고 DB 와 연동할 수 있습니다.
Spring에서 getter와 setter가 어디서 사용되는가?
- 객체의 속성 값을 변경하거나 조회할 때
- getter와 setter를 사용하면 객체의 속성 값을 캡슐화를 유지한 채로 속성 값에 접근 할 수 있습니다.
- 객체의 속성 값을 출력할 때
- 객체의 속성 값을 검증할 때
- 객체의 속성 값을 유효한 값인지 판별하기 위해 setter를 사용하여 유효성 검사를 수행할 수 있다.
- 객체를 JSON 형식으로 변환할 때
- spring에서는 주로 REST api를 개발하는 경우가 많습니다, 이때 객체를 JSON 형식으로 변환하여 클라이언트에게 반환해야 할 경우가 많은데, 이떄 getter 를 사용하여 객체의 속성 값을 JSON 형식으로 변환할 수 있습니다.
빌더란
빌더는 객체를 생성하고 초기화하는 방법 중 하나입니다. 빌더를 사용하면 객체 생성 시 매개변수의 순서를 고려하지 않고 객체를 초기화 할 수 있으며 코드의 가독성과 유지보수성을 높힐 수 있습니다.
빌더를 사용하면
- 코드 가독성이 높아진다.
- 객체 생성시 매개변수의 순서에 구애받지 않는다.
- 유효성 검사등 추가 작업이 용이해진다.
- 객체 불변성을 보장할 수 있다.
generatedValue, ExtendWith
@generatedValue는 JPA에서 객체의 ID값을 자동으로 생성하는 방법을 지정하는 어노테이션입니다.
이 어노테이션을 사용하면 자동 생성 전략을 지정할 수 있다. 그 종류는
- GenerationType.IDENTITY : 데이터베이스에서 자동으로 생성되는 ID값을 사용한다.
- GenerationType.SEQUENCE: 데이터베이스 시퀀스를 사용하여 ID 값을 생성합니다.
- GenerationType.TABLE: 키 생성 전용 테이블을 사용하여 ID 값을 생성합니다.
(이 부분에 대해서는 공부가 더 필요할거 같다.)
@ExtendWith은 JUnit5에서 사용되는 어노테이션으로 더욱 확장된 기능을 사용할 수 있게 도와준다
'백엔드 멘토링' 카테고리의 다른 글
Car-Racing 토이 프로젝트 step 1 회고록 (1) (0) | 2023.07.11 |
---|---|
일급 컬렉션(First-Class Collection)이란? (0) | 2023.07.10 |
2023/04/10 - Spring 공부중 관련 질문들 [1] (0) | 2023.04.13 |
2023/04/05 - java 11, 17 특징 (0) | 2023.04.07 |
2023/03/26 - 객체지향 개념 및 UML,CBD,SOA (0) | 2023.04.07 |