JPA는 DB에 쿼리를 자동적으로 DB방언에 맞춰서 만들어 주는 매우 편리한 기능을 제공한다. 그렇기 때문에, 개발자들은, 서비스 로직에 대한 부분에 집중을 할 수 있으며, 반복적인 코드에 대한 소비를 줄 일 수 있다. 

이러한 JPA와 객체를 매핑시키는 작업을 어노테이션으로 간단하게 할 수 있다.

 

1. 엔티티 매핑에 대해서 소개(Entity Mapping)

 

@Entity 

@Entity
public class Member {
	private Long id;
	private String username;
}

→ 이 엔티티(테이블)는 JPA가 직접 관리한다라는 의미로 밑에 있는 id, username의 객체와 테이블이 매핑된 것이다.          즉, Member class는 JPA가 관리하는 Entity다.

※ 필수 조건으로 반드시 기본 생성자가 존재해야 된다. 또한, final, enum, interface, inner클래스에서 사용할 수없다.

 

@Entity(name = " ")

name =""를 사용하면 JPA에서 사용할 Entity 이름을 지정할 수 있지만, 기본값이 클래스 이름 그대로이기 때문에, 가급적 기본값으로 사용을 한다.

 


 

 

2. 데이터베이스 스키마 자동 생성(Database Schema)

@Entity
public class Member {
	private Long id;
	private String username;
	private String address; //새로 추가update
	prvate String age; // 매핑이 되었는지 확인 validate
}
<properties>
	<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>

	<property name="hibernate.hbm2ddl.auto" value="?" />
</properties>

persistence.xml에서 h2데이터베이스로 데이터 베이스 방언을 설정하고, hibernate가 데이터 베이스 방언으로 적절한 스키마를 생성해준다라는 의미이다.

 

value="org.hibernate.dialect.(H2 Dialect)에서 (?) 안을 다른 데이터베이스로 설정할 수 있다. 

 

property name="hibernate.hbm2ddl.auto" value="?"의 value안에 create, create-drop , update, validate, none를 넣어 스키마를 자동생성 방식을 정할 수 있다.

  • create의 경우기존 테이블을 삭제 후 다시 생성해 준다. 즉, 애플리케이션을 재가동시 전에 저장되었던, 모든 테이블이 드롭(삭제)되고, 다시 생성되므로 id값이 1부터 시작된다.
  • create-drop의 경우 create와 같으나, 종료 시점에 테이블을 drop(삭제)한다.
  • update의 경우 변경되는 부분만 반영된다. 위의 Entity 테이블을 보면, address가 새로 추가하고 싶은데, 테이블을 드롭(삭제)하고 싶지 않을 경우 사용한다. (삭제로 인한 update는 불가)
  • validate의 경우는 Entity와 테이블이 정상 맵핑 되어 있는지 확인해 준다. age를 추가했는데, 테이블에 정상적으로 들어가 있는지 확인할 때
  • none는 뜻그대로, 사용하지 않는다라는 의미이다.

※ 하지만, 운영단계에서 운영서버에서는 절대로 create, create-drop, update를 사용하면 안 된다. 몇천만명의 유저 정보가 있는 테이블이 drop 되고, update로 인해 몇 분간 서비스(시스템)가 중단된다고 생각해보자. 해결할 때 까지 죽어보자..

 


3. 필드와 칼럼 매핑

@Entity 
public class Member { 
 	@Id 
 	private Long id; 
    
 	@Column(name = "name") 
 	private String username; 
    
 	private Integer age; 
    
 	@Enumerated(EnumType.STRING) 
 	private RoleType roleType; 
    
 	@Temporal(TemporalType.TIMESTAMP) 
 	private Date createdDate; 
    
 	@Temporal(TemporalType.TIMESTAMP) 
 	private Date lastModifiedDate; 
    
 	@Lob 
 	private String description; 
 
 	pubilc Member(){
    } //@Entity로 인한 기본생성자 -> @Nooargsconstructor으로 대체 가능
}

(1) @id = id임을 알려준다

 

(2) @Column(name, nullable, length 등등) =  칼럼의 이름, null값 허용 조건, 문자 길이 제약조건 등을 지정할 수 있다.

 

(3) @Enumerated(EnumType.STRING) = enum값 매핑을 할 때 사용한다. 속성의 기본값이 ORDINAL로 되어 있지만, STRING으로 바꾸어 줘야 한다. 그 이유는, 데이터 베이스에 보면, roleType이 숫자로 들어와 있기 때문이다.

username1의 RoleType(RoleType.USER) -> 데이터베이스에 RoleType = 0으로 저장된다. 

username2의 RoleType(RoleType.ADMIN) -> 데이터베이스에 RoleType= 1으로 저장된다. 

하지만, 여기에 GUEST라는 RoleType가 추가된다면

 

밑에 예제를 보자

public enum RoleType{
	USER, ADMIN // -> STUDENT가 추가
    STUDENT, USER, ADMIN
}

STUDENT의 추가로 

username1의 RoleType(RoleType.USER) -> 데이터베이스에 RoleType = 0

username2의 RoleType(RoleType.ADMIN) -> 데이터베이스에 RoleType = 1

username3의 RoleType(RoleType.STUDENT) -> 데이터베이스에 RoleType = 0

으로 010 다시 0부터 시작한다. 예를 들어 0부터 시작하여 1, 2, 3, 4, 5, 6~... 14576849에서 -> 0으로 다시 시작되면 해결할 때까지 죽어야되는 버그가 발생하기 때문에, 꼭 STRING으로 하자 Stirng으로 한다면, USER, ADMIN, STUDENT로 데이터베이스에 저장된다.

 

(4) @Temporal = TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑 (예: 2022–04–22) 

                       TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑 (예: 12:48:44)

                      TemporalType.TIMESTAMP: 날짜와 시간, timestamp 타입과 매핑(예: 2022–04–22 12:48:44)

날짜, 시간을 나타낼 수 있다.

 

(5) @Lob = 지정할 수 있는 속성이 없다. 엄청 큰 데이터를 넣을 때 사용된다.

 

(6) @Transient = 매핑을 하고 싶지 않을 때 사용된다. 데이터베이스에 저장되지 않는다.

 

 

※ 많이 부족한 초보 개발자 입니다. 혼내주세요 배우겠습니다. 

'Back-end > Spring' 카테고리의 다른 글

@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor  (0) 2021.09.11
@Builder  (0) 2021.09.08
@Getter, @Setter  (0) 2021.09.07

클라이언트에서 request이 오고 TCP/IP 연결로 was의 servlet를 호출하고 응답을 보내줍니다.

 

여기서 이 클라이언트 요청에대한 servlet를 호출을 쓰레드가 합니다. 즉, 어떤 작업을 하는 행위의 주체입니다. 

더 쉽게 해보겠습니다.

 

"한우리워리워즈"라는 가게에 남태현이라는 사람이(쓰레드) 있습니다. 그리고 "한우리워리워즈"라는 가게는 10명~20의 고객이 앉을 수 있는 자리가 있습니다.

남태현은, 청소부터 서빙, 요리 등등 모든것을 맡아서 할 수 있습니다. 매일 10명씩의 고객의 주문(요청)을 남태현했었습니다. 하지만, "한우리워리워즈"의 요리가 유명해 지면서 고객들이 증가하기 시작했고, 남태현 혼자서는 고객들의 접대를 할 수 없게 되었습니다. 그래서 자리가 없을 때에는, 고객들은 웨이팅을 하거나, 가게에서 거절을 당해 돌아갔어야 했습니다.

그래서 어쩔 수 없이, 김철(쓰레드)이라는 직원을 고용하여, 2명의직원으로(멀티 쓰레드) 가게를 운영했습니다. 직원을 한명 더 고용했기 때문에, 동시에 고객의 요청을 더 많이 처리할 수 있게 되었지만, 그만큼의 직원의 월급에 대한 지출도 커지게 되었습니다. 그렇게 계속적으로 고객의 요청이 증가하여, 김철 이후로 윤여민, 이태훈, 임병준, 정성찬을 고용했습니다.

이들을 고용한 후 몇일 뒤 가게가 갑작스럽게 다시 장사가 잘 되지않아, 남태현 혼자서도 충분히 고객들의 요청에대한 처리가 가능하게 되었습니다. 그 때문에, 김철 또는 남태현, 윤여민, 이태훈, 임병준, 정성찬 중에 한명은 일을 하고 나머지는 놀고 있는 상태가 되었습니다.

 

이처럼, 고객의 증가로 요청이 증가하면 직원을 더 많이 고용해서 동시에 많은 요청을 처리 하지만, 요청이 줄었을 때를 생각해야됩니다. 왜냐하면, 일을 하지 않는 직원이 생겨 불필요한 월급지출이 크기 때문입니다.

그래서 풀타임 직원이 아닌, 바쁜 시간때 또는 필요할 때마다 불러서 쓸 수 있는 직원들을 고용해 놓았습니다(쓰레드풀). 고객이 요청이 증가할 때, 파트타임 직원들이 나와서 동시에 여러 요청을 처리할 수 있고, 요청이 없을 때는 다시 돌아가면 되니 지출면에서도 효율적으로 되었습니다.

 

개발자들은 쓰레드풀에 몇명에 쓰레드(직원)을 파트타임으로 고용해야 될 지 생각해야 됩니다. 그것이 최대 쓰레드(max thread)입니다.

이 값을 너무 낮게 설정하게 되면, 고객들의 많은 요청을 동시 처리가 부족하여 고객들은 웨이팅을 해야 되거나, 거절을 당해서 집으로 돌아가야됩니다.

반대로, 이 값을 너무 높게 설정하면 많은 여러명의 직원들이 나와서 모든 고객의 요청을 받아 처리를 하려고 하지만, 가게에서 수용할 수 있는 고객의 수가 초과하게 되면 가게는 멘붕(CPU, 메모리 리소스 임계점 초과로)에 빠지게 됩니다. 

 

또 하나의 예로는, 세계적으로 인기있는 게임, 리그오브 레전드라는 게임으로 예를 들어 보겠습니다.

우리는 캐릭터를 선택하고 적과 싸웁니다. 적과 싸울때나, 아무것도 안할 때 보면 골드가 1원씩 계속 올라가고 있습니다. 또 체력, 마나도 회복하고 있습니다. 이것이 쓰레드를 활용한 예입니다.

 

*제가 이해하고 있는 내용이 잘못되었거나, 설명이 이상하면 따끔하게 혼내주세요!

'Back-end > Web' 카테고리의 다른 글

HTTP에서 HTTPS로 구현  (0) 2021.09.11

JAVA란 무엇인가요?

자바는 객체지향 프로그래밍 언어입니다.

 

객체지향 프로그래밍 언어란 무엇인가요?

객체지향 프로그래밍이란 프로그램을 개발하는 기법으로 부품에 해당하는 개체들을 먼저 만들고 이것들을 하나씩 조립 및 연결하여 전체 프로그램을 완성하는 것입니다. 자동차를 생각하면 빠른 이해가 될 수 있습니다. 자동차를 만들때 부품들을 하나씩 먼저 만들고, 부품들어 하나씩 조립하여 완성본인 자동차를 만들죠? 이와같다고 할 수 있습니다. 때문에 유지보수와 확정성면에서 좋습니다.

 

객체 지향의 장점
1. 캡슐화
필요한 속성(Attribute)과 행위(Method)를 하나로 묶고 그중 일부를 외부에서 사용하지 못하도록 은닉한다. 관련된 코드와 데이터가 묶여있고 오류가 없어 사용이 편리합니다. 데이터를 감추고 외부 세계와의 상호작용은 메서드를 통하는 방법인데, 라이브러리로 만들어 업그레이드하면 쉽게 바꿀 수 있습니다.


2. 상속 (extends)
이미 작성된 클래스를 이어받아서 새로운 클래스를 생성하는 기법으로 위에서 말한 기존 코드를 재활용해서 사용하 것을 의미합니다. 객체지향 방법의 큰 장점 중 하나입니다. 

3. 다형성 (Overloading, Override)
하나의 이름(방법)으로 많은 상황에 대처하는 기법입니다. 개념적으로 동일한 작업을 하는 함수들에 똑같은 이름을 부여할 수 있으므로 코드가 더 간단해지는 효과가 있습니다.

 

 

 

'Back-end > JAVA' 카테고리의 다른 글

생성자(constructor)  (0) 2021.09.11

HTTP란 무엇인가요?

http는 웹브라우저와 서버간의 웹페이지 같은 자원을 주고 받을 때 쓰는 통신 규약입니다. 이렇듯 규약이 있기 때문에, 모든 프로그램이 이 규칙에 맞춰 개발하고 서로 정도를 교환할 수 있습니다. HTTP는 연결상태를 유지하지 않는 비연결성 프로토콜입니다. 이것을 개선하기 위해서 COOKIESESSION이 등장하였습니다.

 

HTTPS란 무엇인가요?

HTTP프로토콜의 보안 버전입니다. 인증서를 통해 암호화 및 인증으로 보안이 더욱 강화됩니다.

 

HTTPS를 적용한 이유는 무엇인가요?

HTTP는 단순 텍스트교환이기 때문에 내용이 노출될 수가 있습니다. 하지만, HTTPS는 HTTP의 SSL(TLS)라는 인증서 이용하여 텍스트를 암호화 하기 때문에 내용이 노출되는 것을 막아줍니다. 이러한 이유 때문에, HTTP에서 HTTPS로 바꾸는 작업을 했습니다.

 

SSL/TLS이란 무엇인가요?

SSL보다 TLS가 업그레이드된 버젼입니다. 제공하는 서비스는 무경설, 기밀성, 인증서를 통한 상호인증(서버,클라이언트)입니다.

특정 사이트는 사이트 정보와 사이트 공개키를 기관에게 제출합니다. 기관은 사이트 정보와 공개키를 암호화한 사이트 인증서를 특정사이트에게, 인증기관 공개키는 웹브라우저(구글, 사파리, 익스플로어 등)에게 제공합니다. 사용자가 웹브라우저를 통해 특정사이트에 접속하면 특정사이트는 자신의 인증서를 웹브라우저에게 보냅니다. 인증서를 받은 웹브라우저는 인증기관의 공개키로 서버 인증을 하고 대칭키를 특정사이트에게 보내줍니다. 

 

 

<HTTPS에서 Nginx를 적용한 이유>

https를 적용하기위해서 자료를 찾다가 nginx을 알게 되었고 이는 사용이 매우 심플하고 규모가 작은 서비스이면서 정적 데이터 처리가 많은 서비스에 적합하다는 것을 알게 되었습니다. 이 이점을 살려 nginx를 적용하게 되었습니다.

Let's Encrypt(렛츠 인쿠루프트)의 방법은 무료의 TLS/SSL 인증서를 쉽게 가져오고 설치할 수 있는 방법을 제공하는 CA(인증 기관)으로, 웹 서버에서 암호화된 HTTPS를 사용할 수 있습니다.
이러한 방법은 사용자에게 Certbot(서트봇)라는 소프트웨어를 제공함으로써 구현할 수 있게 합니다.

 

 

웹서버란 무엇인가요? 

웹서버는 클라이언트의 요청을 받아서 정적 컨텐츠를 제공하는 서버입니다. 예를 들어 단순HTML, CSS, 이미지 등 즉시 응답이 가능한 컨텐츠입니다.(웹서버의 대표적인 Apache, Nginx)

하지만, 동적 컨텐츠를 요청 받으면 WAS에게 해당 요청을 넘겨주고, WAS에서 클라이언트에게 전달해줍니다

 

WAS란 무엇인가요?

WAS는 웹서버가 처리 할 수 없는 것들을 처리해 준다. 특히 DB의 조회나 다양한 로직처리가 필요한 동적 컨텐츠를 처리하여 서비스를 클라이언트에게 제공한다. (WAS의 대표적인 Tomcat, Jeus 등이 존재)

 

그렇다면, WAS만 사용하면 되지 않을까라는 생각을 할 수 있습니다.

하지만, WAS는 DB조회 및 다양한 로직을 처리하는 데 집중해야 합니다. 만약 WAS로만 설계하게 되면, 효율성이 크게 떨어지기 때문입니다. 단순한 정적 컨텐츠는 웹서버에게 맡기는 기능을 분리시키고 동적인 것을 WAS에게 맡긴다면, 서버 부하를 방지할 수 있습니다.

 

클라이언트 → Web서버 →DB

클라이언트 → WAS → DB

클라이언트 → Web서버 → WAS →DB (효율적인 분산 처리로 인해 서버 부하를 방지가능)

'Back-end > Web' 카테고리의 다른 글

쓰레드(thread)  (0) 2022.04.14

이 3가지는 생성자를 자동으로 생성해주는 어노테이션이다.

 

@NoArgsConstructor : 파라미터가 없는 생성자를 생성한다.

주의 : 

1. 필드들이 final로 생성되어 있는 경우에는 필드를 초기화 할 수 없기 떄문에, 생성자를 만들 수 없다.

@NoArgsConstructor(force = true)옵션을 이용해서 final필드를 0,false,null등으로 초기화를 강제로 시켜 만들 수 있다.

2. @NonNull같이 필드에 제약조건이 설정되어 있는 경우, 생성자내 null-check로직이 생성되지 않는다.

 

@RequiredArgsConstructor : 추가 작업을 필요로 하는 필드에 대한 생성장를 생성하는 어노테이션이다.

초기화 되지 않은 모든final필드, @NonNull이 적용되어 있는 모든 필드에 자동적으로 생성자를 생성해 준다.

@NonNull로 마크돼있는 필드들은 null-check가 추가적으로 생성되며, @NonNull이 마크되어 있지만, 파라미터에서 null값이 들어온다면 생성자에서 NullPointerException이 발생한다.

파라미터의 순서는 클래스에 있는 필드 순서에 맞춰서 생성해야 된다.

 

@AllArgsConstructor : 클래스에 존내하는 모든 필드에 대한 생성자를 자동으로 생성해준다.

만약 필드중에서 @NonNull 애노테이션이 마크되어 있다면 생성자 내에서 null-check 로직을 자동적으로 생성한다.

 

 

생성자 관련 애노테이션을 사용할 때 주의사항

 

1. static 필드들은 스킵

 

2. 파라미터의 순서는 클래스에 있는 필드 순서에 맞춰서 생성하기 때문에 매우 주의.

 

→ 만약 클래스 필드의 순서를 바꾸었을 때 롬복이 자동적으로 생성자 파라미터 순서를 바꾸어 주기 때문에 주의하지 않으면 버그가 발생할 수 있다.

 

3. AccessLevel을 꼭 설정.

 

→ 세 애노테이션 모두 접근 제한자를 AccessLevel로 설정할 수 있다.

 

기본값은 public이지만 필요로 따라서 접근제한자를 설정해줘야 한다.

'Back-end > Spring' 카테고리의 다른 글

Entity Mapping(엔티티 매핑)  (0) 2022.04.22
@Builder  (0) 2021.09.08
@Getter, @Setter  (0) 2021.09.07

생성자(constructor)란 new연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

생성자 선언방법은 public 클래스(매개변수){

           ......

클래스라는 부분은 생성자를 정의하는 클래스의 이름과 동일하게 적어줘야한다.

 

public class Item {

    private Long id;
    private String itemName;
    private Integer price;
    private Integer quantity;

    public Item() {
    }

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }

Item 클래스의 생성자를 만들어 준것이 밑에 public Itme()이다. 

첫번째 아이템은 기본 생성자로써, 위의 private의 필드들을 초기화를 시켜준다.

두번째 아이템은 값을 받고  itemName, price, quantity의 필드들의 값을 넣어주어주게 된다.

이 때, itemName, price, quantity(맥북, 1,000,000, 1)이라는 값들이 넘어 오게 되면, 

만약에 class가 entity로 지정한다면 우리의 데이터베이스에는

id = 1  itemName = 맥북 prcie = 1,000,000 quantity = 1이 저장되게 될 것이다.

'Back-end > JAVA' 카테고리의 다른 글

JAVA  (0) 2021.09.14

JAVA에는 객체를 생성할 때 사용하는 패턴이 여러가지가 있다. 그 중에서 Builder pattern는 어느 필드에 어떤 값을 채워야 할지 명확하게 지정할 수 있어, 코드가 명시적이다.

[Builder Pattern 의 장점]

1. 필요한 데이터만 설정 가능

2. 가독성을 높일 수 있음

3. 유연성을 확보 가능

4. 불변성을 확보 가능

 

객체를 생성하는 대부분의 경우에는 빌더 패턴을 적용하는 것이 좋다. 물론 예외적인 케이스로 엔티티(Entity) 객체 또는 도메인(Domain) 객체로부터 DTO를 생성하는 경우라면 직접 빌더를 만들고 하는 작업이 번거로우므로 Model Mapper와 같은 라이브러리를 통해 생성을 위임할 수 있다.

 

'Back-end > Spring' 카테고리의 다른 글

Entity Mapping(엔티티 매핑)  (0) 2022.04.22
@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor  (0) 2021.09.11
@Getter, @Setter  (0) 2021.09.07

객체 지향 프로그래밍인 JAVA에서 객체의 데이터는 개체 외부에서 직접적으로 접근하는 것을 막는다.

외부에서 데이터를 읽고 변경할 수 있으면 객체의 무결성이 없어지기 때문이다.

 

@Getter

어노테이션 Getter는, 객체 외부에서 객체의 데이터를 읽을 때 사용되는 어노테이션이다.

@Setter

어노테이션 Setter는, 객체 외부에서 객체의 데이터를 변경시 사용되는 어노테이션이다. 

 

 

'Back-end > Spring' 카테고리의 다른 글

Entity Mapping(엔티티 매핑)  (0) 2022.04.22
@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor  (0) 2021.09.11
@Builder  (0) 2021.09.08

+ Recent posts