https://school.programmers.co.kr/learn/courses/30/lessons/59035

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 :

SELECT NAME, DATETIME from ANIMAL_INS ORDER BY ANIMAL_ID DESC;

 

테이블에서 이름과 날짜를 선택하고 정렬식인 ORDER BY로 ANIMAL_ID를 DESC(역순)으로 정렬한다.

'programmers > Sql' 카테고리의 다른 글

여러기준으로 정렬하기  (0) 2022.07.22
동물아이디와 이름찾기  (0) 2022.07.22
어린동물 찾기  (0) 2022.07.22
아픈동물 찾기  (0) 2022.07.22
모든 레코드 조회하기  (0) 2022.07.22

https://school.programmers.co.kr/learn/courses/30/lessons/59034

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

select * from animal_ins

-> select 선택을 한다, * 모든것을, from ~부터, animal_ins 테이블

 

'programmers > Sql' 카테고리의 다른 글

여러기준으로 정렬하기  (0) 2022.07.22
동물아이디와 이름찾기  (0) 2022.07.22
어린동물 찾기  (0) 2022.07.22
아픈동물 찾기  (0) 2022.07.22
역순 정렬하기  (0) 2022.07.22

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

유학생 때 있었으면 좋겠다라고 생각해 만들어보는 개인 프로젝트

<현재 살고 있는 외국인(유학, 비니지스, 결혼 등)을 위한 중고마켓>

 

1. MarketBoard

     언어가 안되고, 자국의 물품을 구하기 힘든 사람들을 위해 중고 외국인 마켓 게시판

2. CommunityBoard

  -> 외국인들이 궁금해 하는 비자, 현지 문화, 맛집 등의 정보 교환 커뮤니티 게시판

 

기능

회원가입, 로그인, 상품게시글CRUD, 댓글CRUD, 이미지 업로드,  상품구매, 채팅

 

 

+ Recent posts