2월, 2021의 게시물 표시

Scott 과 함께 - Domain을 JPA 로 연결

이미지
Scott Schema To JPA.   이전 Post 는 Oracle DB 의 Scott을 객체로 구현했다. 이번 Post는 JPA와 Scott을 연결한다. 또한 초기 데이터는 Insert 문장이 아닌 JPA로 초기화한다. Entity 연결 이전 Post 에서 Oracle 의 Scott 예제 객체들로 만들어봤다. 이번에는 JPA로 연결해서 DB에 저장되는 것을 확인한다. Employee manager 연결.  DB에서 상위 결재권자는 사번이 들어가지만, 객체는 다른 Employee 객체다. 관리자-직원이 서로 연결할 수 있도록 연관관계를 지정했다. 다음 Post에서 재귀형 데이터 조회 예제를 만들 계획이다. @Entity @Table ( name = "emp" ) public class Employee { ... @ManyToOne ( fetch = FetchType . LAZY ) @JoinColumn ( name = "mgr" ) private Employee manager ; @OneToMany ( mappedBy = "manager" ) private List < Employee > members = new ArrayList <>(); ... } SalaryGrade/SalaryGrades 연결.  SalaryGrades를 EMP 테이블에 급여등급 Column이 만들지 않기 위해 @Transient 로 설정한다. Scott 예제의 기존 Table을 최대한 유지하기 위해서다.   Employee 의 SalaryGrade는 Salary에 따라 변하기 때문에 호출할 때마다 달라진다. Salary 가 바뀌면 바뀐 급여로 나오도록 설정한다. @Entity @Table ( name = "emp...

Spring Integration 과 함께 - 마무리

이미지
마무리...  Spring Integration 예제를 만들며 느낌과 생각을 공유한다. 단순하게 만들자.  Spring Integration 의 IntegrationFlow는 단순하게 만들자. Spring Integration 단일 시스템으로 실행할 수 있고 여러 시스템을 연동해서 사용한다. 연동으로 데이터를 전달할 때, 구성 요소(Transformer, Splitter, Service Activator...)에 지나친 처리로직으로 Blocking이 생기면 지연 문제가 생길 수 있다. (만약 IntegrationFlow가 비동기라면 더 심각할 수 있다.) 길을 만드는 Programming  자바에서 try-catch나 throws로 예외를 처리한다. 이 때, 비즈니스 로직을 멈출 수 있고 우회 방법으로 실행한다. 하지만, Spring Integration 도 errorChannel 혹은 Route 기능을 사용해서 오류를 처리해줄 IntegrationFlow 를 만들자. (드라마 명대사 중 '암세포도 생명(?)' 처럼, 오류도 처리하기 위한 길(路)이 필요하다) DSL로 만들자.  Spring Integration은 3가지로 설정할 수 있다. XML File, @Configuration, 그리고 DSL 이다. 3가지 모두 해본 결과, DSL 이 더 가시적이었다. 물론 STS에서 Spring Integration Component Editor 를 이용하면 그림을 그려준다. 하지만 막힐 때, 인터넷에서 구할 수 있는 답과 예제는 DSL이 더 많고 깔끔했다. 마치며...  약 3주를 하나의 Framework에 꽂혀 본업을 잊을 정도로 재밌게 경험한 것 같다. 삽질도 많아서 지병이 도질 정도로 스트레스를 받았지만, 그래도 나름 의미있는 Back-end 프로그램이었다. 나처럼 고생하는 사람들이 이 글을 통해 포기하지 않고 도움 받길 바란다...

Spring Integration 과 함께 - 실전편(2)

이미지
Spring Integration - Polling Example  이번 post 는 Spring Integration 이 외부 데이터를 가져오는 예제를 만든다. Schedule 을 정해서 주기적으로 데이터를 가져올 수 있어, 개인적인 데이터를 모을 때도 유용하게 쓸 수 있다. 개발환경 JDK : OpenJDK 11 Spring : 2.4.2 DB : h2 구조 환율 가져오는 Flow  환율을 일정한 주기로 Web 에서 가져온다. 가져온 환율을 DB 에 저장한다. 환율.  환율은 이 사이트 를 참조했다. 아래 URL 에서 데이터를 호출하면, 최신 환율 데이터를 EUR 기준으로 가져온다. 데이터 형식은 JSON이다. GET https://api.exchangeratesapi.io/latest DB Tables. Exchange Rate Table 구조 Exchange_rate_meta  Header 정보 역할을 한다. 환율일자, 환율수, 기준통화를 저장한다. 기준 통화는 EUR 이다.   exchange_rate 와 FK 관계를 가진다. 이번 FK 관계는 복잡한 연관관계가 필요없기 때문에, JPA 의 @CollectionTable 를 사용했다.  @Entity @Table ( name = "exchange_rate_meta" ) public class ExchangeRateMetaData { @Id @Column ( name = "exchange_date" ) private LocalDate date ; ...

Spring Integration 과 함께 - 실전편(1)

이미지
Spring Integration Example 학생 Text 파일을 DB 와 File 로 저장하는 예제   이전 post 는 Spring Integration의 간단한 개념을 살펴보았다. 이번에는 동작하는 프로그램을 만든다. Web 에서 전송한 데이터를 DB와 Local File로 저장한다. Web에서 전송한 Text 는 아래와 같다. 순서, 이름, 나이, 성별을 '|' 로 구분하고, 각 학생은 Enter 로 나눴다. 1 | 김철수 | 20 | MALE 2 | 이영희 | 39 | FEMALE 3 | 마이크 | 21 | UNKOWN  김철수는 등록에 성공한다. 이영희는 나이 때문에 실패한다. 마이크는 성별이 정확하지 않아 오류가 발생한다. 개발환경 JDK : OpenJDK 11 Spring : 2.4.2 DB : h2-1.4.199 구성요소(Component) Split  메시지를 분할해서 전송한다. 분할한 메시지는 다음 단계에서 1건 씩 처리한다. 예제에서 각 학생을 Enter 로 분할한다. Transformer  메시지의 내용을 추가/수정/삭제할 수 있는 구성요소다. Split 에서 분할한 메시지를 Student 객체로 바꾼다.  private Student transformToStudent ( String text ) { String [] tokens = text . split ( "\\|" ); String name = tokens [ 1 ]. trim (); Integer age = Integer . valueOf ( tokens [ 2 ]. trim ()); Student . Gender gender = ...

Spring Integration 과 함께 - 개념편

이미지
Spring Integration Spring Integration 카페 예제  EAI(Enterprise Application Integration) 에 대한 소개 자료를 접하면서, Spring Integration과 Apache Camel을 많이 들었다. 어떤 Framework을 살펴볼까...생각 중에 Spring을 공부 중이라 Spring Integration 문서를 읽었다. 나름 매력적으로 느껴져 정리 및 예제를 기록한다. 정의   Spring Integration 은 Spring 의 IoC와 EIP(Enterprise Integration Pattern)을 합쳐 만든 Framework 다. 그래서 Spring은 EIP의 구성 요소들을 구현했다. 비동기와 메세지(Message) 방식을 지원하며, 여러 통신 방식(FTP, Web, TCP...)을 구현한다.  여러 글과 개발하며 느낀 점을 기준으로 생각해봤다. 내가 생각한 이 장난감(?)은... 각 시스템이 데이터를 주고 받기 위한 표준 가이드 프로그램이다.  기업 내에는 여러 시스템들이 존재한다. 이들이 가진 데이터들은 서로 소통하지 않으면 가치가 없다. 반대로, 여러 시스템의 데이터를 합치면 업무 자동화나 새로운 비즈니스 기회를 찾을 수 있는 기회가 생긴다. 그래서 언제나 IT 현업들은 시스템 통합(System Integration)을 시도한다. 하지만 통합은 힘들다. 시스템들은 도입 혹은 구축 이유가 저마다 사정이 있어, 구축 언어와 통신 방법이 다르다.  각 시스템 별 다른 구축과 통신 방식  이런 문제를 개선하기 위해, 각 시스템의 중심에서 데이터들의 중재자 역할을 하는 시스템을 구상한다. 바로 Spring Integration같은 Framework이다. 중계를 통한 시스템 연결.   Spring Integration은 통신 방식과 데이터 표준화를 위해 가이드를 제안한다.  통신 방식의 경우, Spring Integra...

Oracle scott 계정 스키마를 Domain 으로 구성하기

이미지
개인적으로 데이터베이스 Vendor 중에서 가장 좋아하는 예제는 Oracle 의 Dept, Emp, Salgrade 다. 연습할 수 있는 모든 상황이 정리한 가장 좋은 구조다. 이번 글은 위 예제를 자바 객체와 연관관계를 만들어 보고 데이터베이스와 자바 구조는 어떤 차이가 있는지 기록한다. 기회가 되면 JPA 연동해서 구조를 만들어보겠다. Oracle Schema 구조. 테이블은 아래와 같이 3가지로 구성되어 있다. T able Class 설명 emp Employee 직원 dept Department 부서 salgrade Salarygrade 급여등급 자바 객체로 구현. 이 테이블의 구조를 객체의 구조로 해석했다. 사용한 JDK 는 11 버젼이다. 자바와 데이터베이스는 다른...

Blogger 테스트

BLOGGER 에 JAVA 코드 입력 Test BLOGGER 에 JAVA 코드 입력 방법 Blogger 에 자바 코드를 입력하는 방법을 알아내려고 노력중. 먼저 아래와 같은 방법을 찾음 1. hilite.me 2. highlight.js 여러가지를 실험해보는 중 방금전에 알아낸 사실  Ctrl + Shift + 1,2,3,4 를 누르면 글의 서식을 바꿀 수 있다. package com . example . integration . domain ; import javax.persistence.* ; import java.io.Serializable ; @Entity public class Student implements Serializable { @Id @GeneratedValue ( strategy = GenerationType . IDENTITY ) private String id ; private String name ; private Integer age ; @Enumerated ( EnumType . STRING ) private Gender gender ; public Student () { } public Student ( String name , Integer age , Gender gender ) { this . name = name ; this . age = age ; this . gender = gender ; } public enum Gender { MALE , FEMALE ; } public String getId () { return id ; } public String getName () { return name ; } public ...