목록전체 글 (35)
백엔드 개발자
임베디드 타입 ( 값 타입 ) 식별자가 없다. 한 엔티티안에 종속되어 라이프 사이클도 종속된다. 엔티티가 삭제되면 함께 삭제된다. CasCadeType.ALL && 고아객체로 설정한 것과 같다. 식별자가 없으므로 추적도 불가능 하다. JPQL 객체지향 쿼리언어이다. SQL을 추상화한 언어이기 때문에 특정 데이터베이스에 종속되지 않는다. 문법은 sql 과 거의 유사하다. JPQL 문법 COALESCE : null 값인 경우 반환 값 지정 ⇒ coalesce(m.name, ‘이름 없는 회원’) NULLIF : 조건에 맞으면 null 반환 ⇒ NULLIF(m.name, ‘홍길동’) 이름이 홍길동이면 null 반환 CONCAT : 문자열 더하기 concat(’a’, ‘b’) SUBSTRING : 시작위치, 길이..
N + 1 문제 JPA를 이용하여 객체지향적인 설계가 가능해지는데, 엔티티 안에 엔티티를 포함할 경우 한 번 엔티티를 호출하는 것이 해당 엔티티에 포함된 다른 엔티티까지 호출하게 되면서 쿼리가 한 번 혹은 그 이상 더 호출하는 문제가 생기게 된다. JPQL을 사용할 때 발생하게 되는데(jpa에서 지원하는 find는 최적화를 통해 join으로 호출한다) JPQL을 SQL로 변환하여 호출하고 그 안에 필요한 값들을 추가로 호출하게 되는 것이다. 모든 값이 다 필요한 경우라면 모두 조회할 필요가 있지만 그게 아니라면 쓸데없는 호출이 생기는 것이다. 그래서 지연로딩인 FetchType.LAZY 설정을 통해 실제 조회하여 가져오는 것이 아닌 프록시 객체인 빈 껍데기를 넣어 만들어준다. 이것도 결국 모두 조회가 필..
객체와 테이블 매핑 @Entity 엔티티 선언 @Id : primary key 매핑, @GeneratedValue : 키 생성방법 지정, strategy 설정해줄 수 있다. 기본적으로 GenerationType.Auto 가 디폴트 값이다. GenerationType 의 종류 IDENTITY - auto increment 방식 (이 경우 jpa 영속성 컨텍스트에 들어갈 때 id 값이 있는 상태여야 하므로 커밋시점이 아닌 저장메서드를 호출할 때 바로 db로 저장이 된다. SEQUENCE - DB에 저장되어있는 마지막 키값을 불러와 그 다음 값으로 id 설정. (allocationSize를 설정하여 미리 사용할 키값들을 정해놓은 후 사용가능. 매번 db를 조회하지 않아도 됨) TABLE AUTO AUTO는 데..
JOIN 두 개의 테이블을 합치는 것을 JOIN이라고 한다. JOIN을 하는 방법은 크게 4가지 정도가 있다. 설명을 위해 두 개의 테이블이 있다고 가정하겠다. User 테이블 user_id name age item_id 1 홍길동 20 1 2 최세은 25 2 3 이가경 25 3 Item 테이블 item_id name price 1 부활 1000 2 시간증가 500 INNER JOIN 우선 가장 많이 사용되는 JOIN 방법이다. A와 B테이블의 공통된 부분만 가져오는 것이다. 그냥 JOIN 명령어를 사용하면 기본적으로 INNER JOIN 을 한다. SELECT * FROM User A INNER JOIN Item B ON A.item_id = B.item_id 결과는 두 테이블에 공통적으로 존재하는 것만..
기존 데이터 연동 방식 SQL 중심적인 개발 객체를 테이블에 맞춰 작성 ⇒ 객체지향을 따르기 위해 객체답게 설계할 경우 SQL과 매핑하는 과정에서 많은 join과 복잡한 쿼리가 생기게 된다. 그리고 이를 해결해 주는 것이 JPA 이다. JPA 란 ORM (Object relational mapping) 이다. → 객체 관계 매핑 JPA는 JAVA 애플리케이션과 JDBC 사이에서 동작한다. 기존방식처럼 SQL 과 매핑하기 위해 테이블에 맞추지 않고 객체는 객체대로 설계하고 JPA가 이를 변환하여 JDBC 에 넘겨준다. JPA 를 사용해야 하는 이유 객체적인 설계 가능 높은 생산성 유지보수 → 객체 중심으로 객체만 변경하면 됨 자유로운 객체 그래프 탐색 ( 기존: 모든 컬럼들을 모두 조인하여 사용하기에 어려..
현재 공부하고 있는 서버-클라이언트 구조는 클라이언트가 요청 -> 서버에서 응답하는 방식이다. 그런데 우리가 많이 쓰는 카카오톡을 생각해보면 실시간으로 메시지를 보내고 또 받을 수 있어야 한다. 우리가 메시지를 보낸다 == 클라이언트가 서버에 요청한다. 우리가 메시지를 받는다 == 서버가 클라이언트에 보내준다??? NO!! 서버는 클라이언트의 요청에 응답만 할 수 있다. # Polling 그래서 polling으로 일정 시간마다 서버에 계속 요청을 보내서 나한테 온 메시지 있어? 라고 물어볼 수 있다. 음.. 그런데 실시간으로 바로바로 소통이 가능할까? 3초마다 요청을 한다고 하면 3초전에 받은 메시지를 뒤늦게야 받게 될 수 있다. 그래서 우리는 양방향 소통이 가능한 WebSocket 프로그래밍을 사용할 ..
//ec2 서버 ssh 연결 AWS ec2서버를 만들어 준다. 나는 아마존 리눅스 이미지로 만들어줬다. 그리고 연결을 해주려하였는데 bad permissions 이 나왔다. chmod 400 ~/downloads/mmkey.cer 만들어준 키의 권한을 제한해줘야한다. 이것은 필수로 요구된다. //다시 연결 ssh -i "~/downloads/mmkey.cer" ec2-user@ec2-54-145-71-82.compute-1.amazonaws.com SSH 클라이언트 방식으로 연결해주었다. 연결에 성공하면 멋진 새를 볼 수 있다. ssh key 생성 ssh-keygen -t rsa -b 4096 -m PEM --> Your public key has been saved in /home/ec2-user/.s..
ssafy 생활 중 아주 중요한 것이 있다. 바로 입퇴실 체크이다 정해진 입실 퇴실 시간에 맞춰 잘 출석체크를 해야 교육지원금을 온전히 다 받을 수 있는데 우리반에 친구가 이 시간을 놓쳐 지각을 3번 넘게 한 이후로 그 친구는 Mattermost 알림봇을 만들었다. 그리고 내가 이것을 만들게 된 것은 이 친구가 인턴을 합격하여 퇴소를 하게되었기 때문이다. 일요일에 그 친구가 알림봇을 중단한다는 글을 올렸고 나는 월요일부터 알림이 끊기질 않길 바랐기 때문에 자기소개서 작성을 미루고 급하게 만들게 되었다. ## 스타트 사실 알림봇을 만드는 과정은 아주 간단하다. mattermost와 연결될 webhook을 만들고, webhook을 통해 알림이 갈 수 있도록 연결된 프로그램을 만들어 주면 된다. 나는 pyth..