Category: Programming

0

JAVA - JWT

JAVA - JWT Jwts.builder(JwtBuilder) 를 이용해 Token 을 생성하고 Jwts.parserBuilder(JwtParserBuilder) 를 이용해 전달 받은 Token 을 Parsing 한다. public class JwtMain { public static void main(String args[]) { String jwt = Jwts.builder() .setSubject("test") .compact(); Jwt<Header, Claims> headerClaimsJwt = Jwts.parserBuilder() .build() .parseClaimsJwt(jwt); // Token 정보를 가져온다. System.out.println("token : " + jwt); // JWT Header 정보를 가져온다. System.out.println("JWT Header : " + headerClaimsJwt.getHeader()); // JWT Body(Claims) 정보를 가져온다. System.out.println("JWT Claims : " + headerClaimsJwt.getBody()); }} Token 에 서명을 진행하지 않았기 때문에 Signature 부분이 빠져있는 것을 확인할 수 있다. token : eyJhbGciOiJub25lIn0.eyJzdWIiOiJ0ZXN0In0.JWT Header : {alg=none}JWT Claims : {sub=test} JWT 암호화 (JWS) JwtBuilder 객체는 signWith 메소드를 이용해 Key 값과 암호 알고리즘 을 인자값으로 넘겨줘 서명한다. 서명의 유효성은 JwtParserBuilder 객체가 setSigningKey 메소드를 이용해 전달받은 Token 이 유효한지 확인한다. public class JwsMain { public static String key = "amF2YS1hcHBsaWNhdGlvbi1zZWN1cmUtc3R1ZHktand0LXNlY3JldGtleS1pcy1zaG91bGQtYmUtYmlnZ2VyLXRoYW4tNTEyYml0cw=="; public static Long tokenValidityInMilliseconds = 100000L; public static void main(String args[]) { Key secretKey = Keys.hmacShaKeyFor(key.getBytes()); String jwt = Jwts.builder() .setSubject("test") .signWith(secretKey, SignatureAlgorithm.HS512) // JWT 를 암호화 하기 위한 secret 과 알고리즘을 넣어준다. .compact(); Jws<Claims> claimsJws = Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(jwt); Header header = claimsJws.getHeader(); Claims body = claimsJws.getBody(); System.out.println("token : " + jwt); System.out.println("JWT Header : " + header); System.out.println("JWT Claims : " + body); }}

0

JPA 연관 관계 - 상속 관계 Mapping

목차 JPA 연관 관계 - 고아 객체 JPA 연관 관계 - 즉시로딩과 지연로딩 JPA 연관 관계 - 프록시 객체 JPA 연관 관계 - @MappedSuperclass JPA 연관 관계 - 상속 관계 Mapping JPA 연관 관계 - 영속성 전이 Cascade JPA 연관 관계 - 양방향 연관관계와 연관과계의 주인 JPA 연관 관계 - 양방향 연관관계 JPA 연관 관계 - 객체 지향 스럽게 모델링 하기 JPA 연관 관계 - 객체 관계 모델링하기 JPA 연관 관계 JPA 상속 관계 Mapping 관계형 데이터 베이스는 상속 관계가 없다. 슈펴타입 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하다. 상속관계 Mapping : 객체의 상속 관계와 DB 의 슈퍼타입 서브타입 관계를 Mapping 슈퍼타입 서브타입 논리 모델을 객체의 상속관계를 물리 모델로 구현하는 방법 객체의 상속관계를 슈퍼타입 서브타입 모델로 구현하는 방법은 3가지 방법이 있다. 전략 설명 조인 전략 각각 테이블로 변환 (연관 관계로 관리) 단일 테이블 전략 통합 테이블로 변환 (하나의 테이블로 관리) 구현 클래스마다 테이블 전략 서브타입 테이블로 변환 사용하는 어노테이션 @Inheritance @DiscriminatorColumn(name=”DTYPE”) @DiscriminotorValue @Inheritance 전략

0

JPA 연관 관계 - 영속성 전이 Cascade

목차 JPA 연관 관계 - 고아 객체 JPA 연관 관계 - 즉시로딩과 지연로딩 JPA 연관 관계 - 프록시 객체 JPA 연관 관계 - @MappedSuperclass JPA 연관 관계 - 상속 관계 Mapping JPA 연관 관계 - 영속성 전이 Cascade JPA 연관 관계 - 양방향 연관관계와 연관과계의 주인 JPA 연관 관계 - 양방향 연관관계 JPA 연관 관계 - 객체 지향 스럽게 모델링 하기 JPA 연관 관계 - 객체 관계 모델링하기 JPA 연관 관계 JPA 영속성 전이 Cascade Cascading 이란, 특정 Entity 에 작업을 수행했을 때, 같은 작업이 연관된 Entity 에도 일어나는 것을 의미한다. 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다. 엔티티를 연속화 할때 연관된 엔티티도 함께 영속화 하는 편리함을 제공한다. 영속성 전이 옵션 CascadeType.ALL 상위 Entity 에서 발생한 모든 작업을 하위 Entity 로 모두 전파 CascadeType.PERSIST 상위 Entity 를 영속화 하는 작업이 일어 날때 하위 Entity 도 같이 영속화 한다. CascadeType.MERGE 상위 Entity 에서 발생한 Merge 작업을 하위 Entity 까지 Merge 작업을 전파한다. CascadeType.REMOVE 상위 Entity 를 삭제할 때 하위 Entity 까지 삭제한다. CascadeType.REFRESH DataBase 로부터 상위 Entity 를 다시 읽어올때 하위 Entity 까지 다시 읽어온다. CascadeType.DETACH 상위 Entity 를 영속성 컨텍스트에서 제거할 때 하위 Entity 까지 같이 제거한다. @Entity@NoArgsConstructor@AllArgsConstructor@Setter@Getterpublic class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "person", cascade = CascadeType.ALL) private List<Phone> phones = new ArrayList<>(); public void addPhone(Phone phone){ phones.add(phone); phone.setPerson(this); }} @Entity@Builder@NoArgsConstructor@AllArgsConstructor@Getter@Setterpublic class Phone { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public Long id; public String phoneNumber; @ManyToOne @JoinColumn(name = "PERSON_ID") public Person person;}

0

STL - map 컨테니어

map 연관 컨테이너 에서 원소로 Key와 Value의 쌍으로 저장되는 컨테이너[] 연산자를 이용해 value 에 접근 할 수 있다. (value = m[key] 형태로 사용) key 는 중복해서 저장될 수 없다. 노드 기반 컨테이너 균현 이진 트리로 구현돼 있다. Map Member 함수 함수 설명 반환 값 begin() 첫번째 원소를 가르키는 iterator 를 가져온다 iterator end() 마지막 원소를 가르키는 다음 iterator 를 가져온다 iterator clear() map 내 모든 원소를 삭제한다 empty() map 이 비었는지 확인한다 bool size() map 에 저장된 원소의 개수를 가져온다 int find(key) map 내 key 가 저장된 iterator 를 가져온다. 없으면 end iterator를 반환한다 iterator count(key) map 내 key 의 개수를 가져온다 int erase(key) map 내 key 원소를 삭제한후 다음 원소를 가르키는 itrator를 반환한다 iterator erase(iterator) iterator 가 가르키는 원소를 삭제한 후 다음 원소를 가르키는 iterator를 반환한다 iterator erase(begin, end) iterator begin에서 end까지 원소를 삭제한 후 다음 원소를 가르키는 iterator를 반환한다 iterator insert(key) map 에 key 를 삽입한 후 저장된 iterator와 성공 여부를 담는 Pair 객체를 반환한다 Pair<iterator, bool> insert(begin, end) iterator begin에서 end까지 원소를 map 에 삽입한다. lower_bound(key) key 값 보다 같거나 큰 값이 처음으로 나타나는 iterator 를 반환한다. (이상) iterator upper_bound(key) key 값 보다 큰 값이 처음으로 나타나는 iterator 를 반환한다. (초과) iterator

0

STL - set 컨테이너

set 연관 컨테이너 에서 key 라 불리는 원소의 집합으로 이뤄진 컨테이너 key 는 중복해서 저장될 수 없다. 노드 기반 컨테이너 균현 이진 트리로 구현돼 있다. 시퀸스 컨테이너로 배열과 비슷하지만 동적으로 데이터를 추가할 수 있고, 크기가 자동으로 늘어난다는 장점이 있다. Set Member 함수 함수 설명 반환 값 begin() 첫번째 원소를 가르키는 iterator 를 가져온다 iterator end() 마지막 원소를 가르키는 다음 iterator 를 가져온다 iterator clear() set 내 모든 원소를 삭제한다 empty() set 이 비었는지 확인한다 bool size() set 에 저장된 원소의 개수를 가져온다 int find(key) set 내 key 가 저장된 iterator 를 가져온다. 없으면 end iterator를 반환한다 iterator count(key) set 내 key 의 개수를 가져온다 int erase(key) set 내 key 원소를 삭제한후 다음 원소를 가르키는 itrator를 반환한다 iterator erase(iterator) iterator 가 가르키는 원소를 삭제한 후 다음 원소를 가르키는 iterator를 반환한다 iterator erase(begin, end) iterator begin에서 end까지 원소를 삭제한 후 다음 원소를 가르키는 iterator를 반환한다 iterator insert(key) set 에 key 를 삽입한 후 저장된 iterator와 성공 여부를 담는 Pair 객체를 반환한다 Pair<iterator, bool> insert(begin, end) iterator begin에서 end까지 원소를 set 에 삽입한다. lower_bound(key) key 값 보다 같거나 큰 값이 처음으로 나타나는 iterator 를 반환한다. (이상) iterator upper_bound(key) key 값 보다 큰 값이 처음으로 나타나는 iterator 를 반환한다. (초과) iterator insert(begin, end) 다른 컨테이너어 저장된 데이터를 set 에 데이터를 넣을때 사용하면 유용한 함수다.

0

STL - vector 컨테이너

vector 시퀸스 컨테이너로 배열과 비슷하지만 동적으로 데이터를 추가할 수 있고, 크기가 자동으로 늘어난다는 장점이 있다. Vector Member 함수 함수 설명 반환 값 push_back(value) vector 끝에 value 를 넣는다 pop_back() vector 의 마지막 원소를 삭제한다 begin() vector 의 첫번째 원소를 가르키는 iterator를 가져온다 Iterator end() vector 의 마지막 원소 다음을 가르키는 iterator를 가져온다. Iterator clear() vector 내 모든 원소를 삭제한다. size() vector 에 저장된 원소의 개수를 반환한다. int empty() vector 가 비었는지 확인한다. bool insert(iterator, value) 해당 iterator가 가르키는 위치에 value를 삽입한다. insert(iterator, begin, end) 해당 iterator가 가르키는 위치에 특정 iterator 가르키는 begin 에서 end 까지 원소를 삽입한다. erase(iterator) 해당 iterator가 가르키는 원소를 삭제한다. 반환 값으로 다음 iterator 를 반환한다. Iterator erase(begin, end) begin 에서 end 범위까지 원소를 삭제한다. 반환 값으로 삭제한 마지막 원소 다음 iterator를 가져온다. Iterator assign(n, value) vector 에 value를 n 개 만큼 할당한다. 이전 값이 있더라도 초기화 되고 재할당된다. assign(begin, end) vector 값을 특정 iterator 가르키는 begin 에서 end 범위 값으로 할당한다 이전 값이 있더라도 초기화되고 재할당된다. at(index) index가 가르키는 value를 가져온다. 데이터 삽입 함수push_back 함수 push_back 함수는 vector 마지막에 원소를 넣어준다. #include <iostream>#include <vector>using namespace std;int main(void) { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); for (int a : v) { cout << a << " "; } cout << endl; return 0;} 1 2 3

0

JPA 연관 관계 - @MappedSuperclass

목차 JPA 연관 관계 - 고아 객체 JPA 연관 관계 - 즉시로딩과 지연로딩 JPA 연관 관계 - 프록시 객체 JPA 연관 관계 - @MappedSuperclass JPA 연관 관계 - 상속 관계 Mapping JPA 연관 관계 - 영속성 전이 Cascade JPA 연관 관계 - 양방향 연관관계와 연관과계의 주인 JPA 연관 관계 - 양방향 연관관계 JPA 연관 관계 - 객체 지향 스럽게 모델링 하기 JPA 연관 관계 - 객체 관계 모델링하기 JPA 연관 관계 공통 Mapping 정보를 관리하기 위한 MappedSuperclass Entity 에 공통적으로 들어가는 Mapping 정보를 관리해 코드가 중복해서 작성하는 것을 방지하기 위해 사용하는 어노테이션 상속관계 Mapping 이 아니다. 부모 클래스를 상속 받는 자식 클래스에 Mapping 정보만 을 제공한다. 직접 생성해서 사용할 일이 없으므로 추상클래스(abstract) 를 사용하는 것이 좋다. MappedSuperclass 클래스를 상속 받기 위해서는 같은 @MappedSuperclass 를 사용한 클래스나 @Entity 을 이용한 클래스만 상속이 가능하다. 요구 사항 모든 Entity 에는 생성자, 생성일, 수정자, 수정일 정보가 들어가야 한다. 모든 Entity 에 공통적으로 들어가는 Mapping 정보 를 관리하기 위한 BaseEntity 클래스를 생성한다. @MappedSuperclasspublic abstract class BaseEntity { private String createdBy; private LocalDateTime createdDate; private String lastModifiedBy; private LocalDateTime lastModifiedDate;}

0

Docker Compose - Kafka 클러스터 구성하기

목차 Docker Compose - Kafka 사용하기 Docker Compose - Kafka 클러스터 구성하기 zookeeper 설정version: "3.6"services: zookeeper: container_name: zookeeper image: wurstmeister/zookeeper:3.4.6 volumes: - "./zookeeper/data:/data" - "./zookeeper/logs:/datalog" ports: - "2181:2181" Kafka 설정 KAFKA_BROKER_ID KAFKA_ZOOKEEPER_CONNECT KAFKA_ADVERTISED_HOST_NAME KAFKA_ADVERTISED_PORT KAFKA_CREATE_TOPICS KAFKA_ADVERTISED_LISTENERS KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2 version: "3.6"... kafka1: container_name: kafka1 image: wurstmeister/kafka:2.12-2.3.0 restart: on-failure ports: - "9092:9092" volumes: - /var/run/docker.sock:/var/run/docker.sock environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_HOST_NAME: 192.168.0.2 KAFKA_ADVERTISED_PORT: 9092 KAFKA_CREATE_TOPICS: "temp_topic:1:1" KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.2:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2 depends_on: - zookeeper 전체 소스 코드version: "3.6"services: zookeeper: container_name: zookeeper image: wurstmeister/zookeeper:3.4.6 volumes: - "./zookeeper/data:/data" - "./zookeeper/logs:/datalog" ports: - "2181:2181" kafka1: container_name: kafka1 image: wurstmeister/kafka:2.12-2.3.0 restart: on-failure ports: - "9092:9092" volumes: - /var/run/docker.sock:/var/run/docker.sock environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_HOST_NAME: 192.168.0.2 KAFKA_ADVERTISED_PORT: 9092 KAFKA_CREATE_TOPICS: "temp_topic:1:1" KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.2:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2 depends_on: - zookeeper kafka2: container_name: kafka2 image: wurstmeister/kafka:2.12-2.3.0 restart: on-failure ports: - "9093:9092" volumes: - /var/run/docker.sock:/var/run/docker.sock environment: KAFKA_BROKER_ID: 2 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_HOST_NAME: 192.168.0.2 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.2:9093 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2 depends_on: - zookeeper kafka3: container_name: kafka3 image: wurstmeister/kafka:2.12-2.3.0 restart: on-failure ports: - "9094:9092" volumes: - /var/run/docker.sock:/var/run/docker.sock environment: KAFKA_BROKER_ID: 3 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_HOST_NAME: 192.168.0.2 KAFKA_ADVERTISED_PORT: 9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.2:9094 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2 depends_on: - zookeeper

0

Docker Compose - Kafka 사용하기

목차 Docker Compose - Kafka 사용하기 Docker Compose - Kafka 클러스터 구성하기 Zookeeper 설정version: "3"services: zookeeper: container_name: local-zookeeper image: wurstmeister/zookeeper ports: - 2181:2181 Kafka 설정version: "3"services: zookeeper: container_name: local-zookeeper image: wurstmeister/zookeeper ports: - 2181:2181 kafka: container_name: local-kafka image: wurstmeister/kafka depends_on: - zookeeper ports: - 9092:9092 environment: KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock 전체 소스 코드version: "3"services: zookeeper: container_name: local-zookeeper image: wurstmeister/zookeeper ports: - 2181:2181 kafka: container_name: local-kafka image: wurstmeister/kafka depends_on: - zookeeper ports: - 9092:9092 environment: KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock

0

Docker - Jenkins 사용하기

Docker - Jenkins 사용하기# lts버전으로 실행시docker run -d -p 8090:8080 -p 50000:50000 -v ~/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts# jdk11버전으로 실행시docker run -d -p 8090:8080 -p 50000:50000 -v ~/docker/jenkins-jdk11:/var/jenkins_home jenkins/jenkins:jdk11# docker container Id3c29b7adb686ad8310bf474fe91406e1ab8c569568e2ef2b5d09f40525aa78ee

0

Docker - MySQL 사용하기

Docker - MySQL 사용하기docker pull mysql:8.0.17 Docker MySQL 컨테이너 생성 및 실행 MySQL 외부 볼륨으로 잡아주기 호스트의 ~/docker/mysql 디렉토리를 MySQL 컨테이너의 /var/lib/mysql 디렉토리로 마운트 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name mysql -v ~/docker/mysql:/var/lib/mysql mysql --character-set-server=utf8mb4 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name mysql -v ~/docker/mysql:/var/lib/mysql mysql:8.0.17 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

0

JPA 연관 관계 - 양방향 연관관계와 연관과계의 주인

목차 JPA 연관 관계 - 고아 객체 JPA 연관 관계 - 즉시로딩과 지연로딩 JPA 연관 관계 - 프록시 객체 JPA 연관 관계 - @MappedSuperclass JPA 연관 관계 - 상속 관계 Mapping JPA 연관 관계 - 영속성 전이 Cascade JPA 연관 관계 - 양방향 연관관계와 연관과계의 주인 JPA 연관 관계 - 양방향 연관관계 JPA 연관 관계 - 객체 지향 스럽게 모델링 하기 JPA 연관 관계 - 객체 관계 모델링하기 JPA 연관 관계 양방향 연관관계의 문제점 객체에서는 각기 다른 객체에서 참조하는 객체를 업데이트 하는 방법이 두 가지가 발생한다. 양방향 연관관계의 해결 방법 객체의 두 관계중 하나를 연관관계의 주인 으로 지정해 주인만이 외래 키를 관리하게 한다.(등록, 수정)주인이 아닌 쪽은 읽기만 가능하다 양방향 연관관계 주인 정하기 Foreign Key (외래키) 가 있는 곳을 주인으로 정해라 연관관계의 주인은 mappedBy 속성을 사용할 수 없다. 연관관계 주인이 아니면 mappedBy 속성을 사용할 수 있다.

0

JPA 연관 관계 - 양방향 연관관계

목차 JPA 연관 관계 - 고아 객체 JPA 연관 관계 - 즉시로딩과 지연로딩 JPA 연관 관계 - 프록시 객체 JPA 연관 관계 - @MappedSuperclass JPA 연관 관계 - 상속 관계 Mapping JPA 연관 관계 - 영속성 전이 Cascade JPA 연관 관계 - 양방향 연관관계와 연관과계의 주인 JPA 연관 관계 - 양방향 연관관계 JPA 연관 관계 - 객체 지향 스럽게 모델링 하기 JPA 연관 관계 - 객체 관계 모델링하기 JPA 연관 관계 객체와 테이블이 관계를 맺는 차이 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로다른 단방향 관계 2개 다.테이블은 외래키 하나 로 두 테이블의 연관관계를 관리한다. 객체 : 연관관계 2개 (단방향 2개) 회원 —> 팀 연관관계 1개 (단방향) 팀 —> 회원 연관관계 1개 (단방향) 테이블 : 연관관계 1개 (양방향 1개) 회원 <—> 팀의 연관관계 1개 (양방향) 양방향 연관관계로 설계하기1:N 연관관계 Mapping OneToMany 어노테이션을 이용해 1:N 연관관계를 Mapping 한다. mappedBy 속성을 이용해 연관된 Entity 클래스 내 field 이름을 넣어준다. @Entitypublic class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>();}