2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[Spring] Entity...!

2024. 8. 19. 21:19ㆍ스프링

1. 하루에 4개씩 기초 지식!

더보기

1. 클래스 멤버 변수 초기화 순서에 대해 설명해주세요

  • static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화 된다.
  • 필드 변수 선언부 : 객체가 생성될 때 생성자 block 보다 앞서 초기화 된다.
  • 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking (thread-safe 영역)


2.  static에 대해 설명해주세요

  • static 키워드를 사용한 변수나 메서드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로
    사용할 수 있습니다. // 인스턴스 객체 생성 없이 바로 사용 가능
  • 모든 객체가 메모리를 공유한다는 특징이 있고, 가비지컬렉터 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지
    메모리에 값이 유지된 채로 존재.
  • static 사용하는 이유
    • static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어 매번 메모리에 로딩하거나
      값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개녕을 통해 접근 하는 것이 비용도 줄이고 효율을 높일 수 있다.
    • 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용


3. 내부 클래스(Inner Class)의 장점?

  • 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근 가능
  • 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 캡슐화를 증가, 코드의 복잡성을 낮춤
  • 외부에서는 내부 클래스에 접근할 수 없으므로, 코트의 보안성 증가


4. Reflection? 리플렉션?

  • 리플렉션이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

  • 언제 사용..?
    • 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 
      가져와서 실행해야 하는 경우 사용.
    • 프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공합니다. intelliJ의 자동완성 기능
      스프링의 어노테이션이 리플렉션을 이용한 기능이라 할 수 있습니다.

 


2. 내용 알고가기  

 

entity란?

JPA에서 관리되는 클래스 즉, 객체를 의미!!!!

 

  • 데이터베이스에서 영속적으로 저장되고 관리되는 객체를 가리킨다.
  • entity는 데이터베이스의 테이블의 레코드(행)에 해당, 객체 지향 프로그래밍에서는 해당 데이터를 표현하는 클래스로 구현된다.
  • 즉, entity는 영속성을 가지고, 이는 객체의 상태가 데이터베이스에 저장되고 관리되는 것을 의미.
    1.  Persistence(영속성) : entity는 영속정이라는 특성을 가지고 있음. 객체의 상태가 프로그램 실행이 종료되더라도
      계속해서 유지, 필요할 때 데이터베이스에 저장되고 관리되는 것을 의미

    2.  데이터베이스 테이블과 매핑 : entity class 는 데이터베이스의 테이블과 매우 유사한 구조를 가지며, 클래스의 인스턴스는
      데이터베이스 테이블 래코드(행)에 대응
    3. JPA(Java Persitence API) : JPA가 엔티티를 관리하는 데 사용된다. JPA는 자바에서 객체 - 관계 매핑을 위한 API로,
      엔티티 클래스 데이터베이스 간의 매핑 및 영속성을 제어할 수 있는 기능을 제공

    4. C.R.U.D 작업 : 엔티티를 통해 데이터베이스에서의 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있다.
      객체 지향 프로그래밍에서는 메서드 호출을 통해, 데이터 베이스에서는 SQL 쿼리를 통해 이루어진다
@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 값을 넣어주지 않아도 자동으로 순서에 맞게 기본 키가 추가 된다!