1. 하루에 4개씩 기초 지식!
더보기
1. 클래스 멤버 변수 초기화 순서에 대해 설명해주세요
- static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화 된다.
- 필드 변수 선언부 : 객체가 생성될 때 생성자 block 보다 앞서 초기화 된다.
- 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking (thread-safe 영역)
2. static에 대해 설명해주세요
- static 키워드를 사용한 변수나 메서드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로
사용할 수 있습니다. // 인스턴스 객체 생성 없이 바로 사용 가능 - 모든 객체가 메모리를 공유한다는 특징이 있고, 가비지컬렉터 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지
메모리에 값이 유지된 채로 존재. - static 사용하는 이유
- static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어 매번 메모리에 로딩하거나
값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개녕을 통해 접근 하는 것이 비용도 줄이고 효율을 높일 수 있다. - 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용
- static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어 매번 메모리에 로딩하거나
3. 내부 클래스(Inner Class)의 장점?
- 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근 가능
- 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 캡슐화를 증가, 코드의 복잡성을 낮춤
- 외부에서는 내부 클래스에 접근할 수 없으므로, 코트의 보안성 증가
4. Reflection? 리플렉션?
- 리플렉션이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
- 언제 사용..?
- 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를
가져와서 실행해야 하는 경우 사용. - 프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공합니다. intelliJ의 자동완성 기능
스프링의 어노테이션이 리플렉션을 이용한 기능이라 할 수 있습니다.
- 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를
2. 내용 알고가기
entity란?
- 데이터베이스에서 영속적으로 저장되고 관리되는 객체를 가리킨다.
- entity는 데이터베이스의 테이블의 레코드(행)에 해당, 객체 지향 프로그래밍에서는 해당 데이터를 표현하는 클래스로 구현된다.
- 즉, entity는 영속성을 가지고, 이는 객체의 상태가 데이터베이스에 저장되고 관리되는 것을 의미.
- Persistence(영속성) : entity는 영속정이라는 특성을 가지고 있음. 객체의 상태가 프로그램 실행이 종료되더라도
계속해서 유지, 필요할 때 데이터베이스에 저장되고 관리되는 것을 의미 - 데이터베이스 테이블과 매핑 : entity class 는 데이터베이스의 테이블과 매우 유사한 구조를 가지며, 클래스의 인스턴스는
데이터베이스 테이블 래코드(행)에 대응 - JPA(Java Persitence API) : JPA가 엔티티를 관리하는 데 사용된다. JPA는 자바에서 객체 - 관계 매핑을 위한 API로,
엔티티 클래스 데이터베이스 간의 매핑 및 영속성을 제어할 수 있는 기능을 제공 - C.R.U.D 작업 : 엔티티를 통해 데이터베이스에서의 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있다.
객체 지향 프로그래밍에서는 메서드 호출을 통해, 데이터 베이스에서는 SQL 쿼리를 통해 이루어진다
- Persistence(영속성) : entity는 영속정이라는 특성을 가지고 있음. 객체의 상태가 프로그램 실행이 종료되더라도
@Entity
@Table(name = "memo)
public class Memo{
@Id
private Long id;
- 위 코드에서 @Entity를 사용해 JPA가 관리할 수 있는 Entity 클래스를 지정하고 아래 @Table(name ="memo")를 사용하여
매핑할 테이블의 이름을 지정하였다! 여기서 Entity 클래스의 이름을 지정할 수 있는데 Entity(name = "name") 이렇게 지정을 해야 합니다! - 또한 JPA가 Entity 클래스를 인스턴스화 할 때 기본 생성자를 사용하기 때문에 반드시 현재 Entity 클래스에서 기본 생서자가
생성되고 있는지 확인해야 합니다!
@Column...넌 뭐니...
Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name = "memo") // 매핑할 테이블의 이름을 지정
public class Memo {
@Id
private Long id;
<------------------------------------>
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "contents", nullable = false, length = 500)
private String contents;
}
- @Column(nullalbe)은 null 값의 허용을 알려주면서 중복 허용 여부를 알려주는 boolean 타입의 unique를 사용하였습니다.
- @Column(length)는 데이터 값의 길이에 제약 조건을 걸 수 있습니다. 또한 Entity와 마찬가지로 테이블 이름을 지정할 수 있는데
@Column(name = " name " ) 을 사용하면 테이블에 이름을 넣울 수 있습니다!.
나왔다 @id
- @id : 테이블에 기본 키를 지정해줍니다!
- 이 기본 키는 영속성 컨텍스트에서 Entity를 구붆하고 관리할 때 사용되는 식별자 역할을 수행한다!
- 그 대신 기본 키, 식별자 값 없이 저장을 하면 오류가 난다!
- @id는 개발자가 직접 키 값을 확인하고 넣어줘야하는데 이게 귀찮아 그래서 아래 @GeneratedValue가 나왔다..!
Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Table(name = "memo") // 매핑할 테이블의 이름을 지정
public class Memo {
@Id
@GeneratedValue(strategy = GeneratioonType,IDENTITY)
private Long id;
- 자 @GeneratedValue란 무엇일까? 저 녀석은 옵션을 추가하면 기본 키 생성을 데이터베이스에 위힘을 할 수 있다?
- @GeneratedValue(strategy = GenerationType.IDENTITY)를 사용하면은 auto_increment 조건이 추가된 것을
확인할 수 있다! - 이 녀석은 직접 id 값을 넣어주지 않아도 자동으로 순서에 맞게 기본 키가 추가 된다!
'스프링' 카테고리의 다른 글
Spring JPA 뭐하는 키워드지..? (1) | 2024.08.24 |
---|---|
스프링 의존성 주입? 강한 결합? 느슨한 결합? (0) | 2024.08.21 |
Servlet은 뭐고 Dispatcher - Servlet은 뭐죠..? (0) | 2024.08.20 |
[TIL] 2024.08.16 [Java/Spring] (0) | 2024.08.19 |
[TIL] Java 2024.08.08 (0) | 2024.08.09 |