안녕하세요. 진행하고 있는 프로젝트에서 친구에게 배타테스트를 진행했는데 편지지에 이모티콘이 들어가면 오류가 난다는 것을 알게되었습니다. 왜 이모티콘이 들어가지 않는걸까요? 인코딩은 모두 utf8로 설정했습니다. sql 에러는 아래와 같습니다. java.sql.SQLException: Incorrect string value: '\xF0\x9F\xA4\xAF' for column '칼럼명' at row 1 mysql은 이모티콘을 인코딩할 때, 4byte로 변환되는데 utf8 은 문자셋을 3byte까지만 지원하기 때문입니다. 해결책 인코딩 방식을 utf8mb4로 변경해줍니다. ALTER TABLE 테이블명 MODIFY COLUMN 컬럼 VARCHAR(255) CHARACTER SET utf8mb4 COLLA..
안녕하세요. 오늘은 아래의 아키텍처를 구현하는 방법에 대해 알아보려고 합니다. 그 중에서도 docker nginx에 ssl 인증을 추가한 뒤, 이를 리버스 프록시 서버로 두고 요청이 들어오면 웹어플리케이션 서버로 넘겨주는 부분을 구현해보겠습니다. 현재 상황 서버는 ncp classic 서버를 사용했습니다. 도메인 또한 구입하여 적용해놓았습니다. acg는 80 포트와 8080 포트 모두 열어놓았습니다. spring boot의 경우 nohup java -jar .jar파일 & 를 통해 배포한 상황입니다. Docker Nginx 컨테이너 올리기 // nginx 이미지 가져오기 docker pull nginx // nginx 올리기 docker run --name proxy -d -p 443:443 -p 80:..
안녕하세요. 오늘은 JPA 데이터 타입에 대하 알아보는 시간을 갖으려 합니다. 김영한님의 자바 ORM 표준 JPA 프로그래밍을 읽고 정리했습니다. JPA의 데이터 타입을 크게 분류하면 엔티티 타입과 값 타입으로 나눌 수 있다. 엔티티 타입은 @Entity로 정의하는 객체고, 값 타입은 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체를 말한다. 엔티티 타입은 식별자를 통해 지속해서 추적할 수 있지만, 값 타입은 식별자가 없고 숫자나 문자같은 속성만 있으므로 추적할 수 없다. 기본값 타입@Entity public class Member { @Id @GeneratedValue private Long id; private String name; private int ag..
안녕하세요. 오늘은 프록시와 즉시로딩, 지연로딩 그리고 영속성 전이와 고아 객체에 대해 알아보는 시간을 가지려 합니다. 김영한님의 자바 ORM 표준 JPA 프로그래밍을 읽고 정리했습니다. 프록시 엔티티를 조회할 때 연관된 엔티티들이 항상 사용되는 것은 아니다. 예를 들어 회원 엔티티를 조회할 때, 연관된 팀 엔티티가 사용되지 않을 때도 있다. 사용되지 않는 팀 엔티티를 미리 조회하는 것은 효율적이지 못하다. JPA는 이런 문제를 해결하기 위해 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이를 지연 로딩이라고 한다. 쉽게 이야기하면 team.getName() 과 같이 팀 엔티티 값을 실제 사용하는 시점에 데이터베이스에서 팀 엔티티에 필요한 데이터를 조회하는 것이다. 지연 로딩..
안녕하세요. 저번 게시글에서는 다대일, 일대다, 일대일, 다대다 매핑에 대해서 알아보았는데요. 이번에는 그 외에 상속 매핑, 복합 키, 조인 클래스 등에 대해 알아보려 합니다. 김영한님의 자바 ORM 표준 JPA 프로그래밍을 읽고 정리했습니다. 상속 관계 매핑 관계형 데이터베이스에는 객체지향 언어에서 다루는 상속 개념이 없다. 대신에 슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. ORM에서 이야기하는 상속 관련 매핑은 객체의 상속 구조와 데이터베이스 슈퍼타입, 서브타입 관계를 매핑하는 것이다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 있다. 조인 전략, 단일 테이블 전략, 구현 클래스마다 테이블 전략이다. 이 방법들에 대..