- Today
- Total
목록전체 글 (319)
개발하는 고라니
현재 혼자 프로젝트를 하는 거라 지속적 통합(CI)은 굳이 필요하지 않지만, 지속적 배포(CD)는 절실히 필요성을 느껴 CI/CD를 공부하는 중이며, tool은 Jenkins를 써보려 한다. 우선 Jenkins와 친해지기 위해 간단한 Spring Boot 프로젝트를 Jenkins로 빌드하는 과정을 경험해보자. 목차 Spring Boot project 생성 Github Repository 생성 후, boot Project 연동 Jenkins Job 생성 Jenkins Job 빌드 스프링 부트 생성 방법은 많지만 대표적으로 1) start.spring.io 에서 jar파일을 받아 생성하는 것과 2) IDE에서 생성하는 방법 이 있는데 나는 IntellJ에서 생성할 것이다. - Java 11 - Gradle ..
프로그래밍을 하다보면 동기와 비동기는 많이 들어보았을 것이다. 이때 동기는 흔히 'A가 B에게 작업을 요청했을 때, B의 작업이 끝날 때 까지 A가 기다렸다가 나머지 작업을 수행하는 것.' 반대로 비동기는 'A가 B에게 작업을 요청했을 때, B의 작업과 별개로 A의 나머지 작업을 다시 수행하는 것.' 으로 이해하고 있었다. 하지만 블로킹과 논블로킹의 개념을 접하고 나니 알고있던 것이 반은 맞고 반은 틀린(?) (사실 반이라도 맞는지 모르겠다) 사실이었다. 그래서 쉽사리 알기 힘든 개념이고, 앞으로 프로그래밍 하는데 있어 반드시 필요한 개념이라고 생각되어 동기와 비동기, 블로킹과 논블로킹의 개념을 정리해보고자 한다. Sync vs Async, Blocking vs Non-Blocking ※ 블로킹과 논블로..
기존에 개발을 하며 종종 들어보거나 무엇인지 대충 찾아본 적은 있다. Continous Integration, Continous Delivery or Continous Deployment... 지속가능한 통합, 지속가능한 배포... 이정도로만 알고있었다. 심지어 처음에 들었을 때 '이걸 왜 쓰지??' 라는 생각이 들었다. 그만큼 필요성을 느끼지 못했었고 지금 생각해보면 경험 부족으로 인한 것이었다. 지금은 그 필요성을 느끼게 되었다. 프로젝트를 진행하는데 총 3개의 서버(어플리케이션)을 관리하고 있고, 이를 배포하기 위해 GCP(Google Cloud Platform)를 사용하는데 매번 다음의 과정을 거쳤다. 1) IntelliJ에서 Code 작업 2) git add . 3) git commit 4) G..
OSIV (Open Session In VIew) 순수 JPA를 공부할 때는 접해본 적 없는 단어이지만, Spring Boot + JPA를 공부하다보면 종종 언급되는 단어이다. 여기서 Session은 서버 단에서 사용자의 데이터를 저장해주는 Session이 아니다. 흔히 알고있는 JPA의 Entity Manager가 Hibernate에서는 Session이라 불린다. 그래서 Hibernate에서는 Open Session In View라 하고, JPA에서는 Open EntityManager In View라 하는데 관례상 OSIV라 한다. OSIV를 풀어 말해보면, 'View에서도 Session(EntityManager)가 열려있다' 고 말할 수 있겠다. 그럼 이것이 중요할까? 중요하다. 이로 인해 실시간 트..
최근에 사이드 프로젝트를 진행하고 있다. 기획 및 설계, 구현과 테스트 빌드 그리고 배포까지 스스로 해보는 것이 목표이다. 배포는 클라우드 서비스를 이용해 진행했는데, 처음으로 웹 서버(Nginx)를 사용해보았다. 특히 웹 서버를 사용하면 서버의 정보(예: port)를 숨길 수 있는 'Reverse Proxy'를 할 수 있다. 특정 URL로 접근하는 경우 특정 포트로 넘겨주는 작업을 할 수 있는데, 이는 웹소켓을 연결하는 과정에서 문제가 되었다. 이 글은 Reverse Proxy를 적용한 Nginx 환경에서 WebSocket을 WebSocket Server와 연결할 때 주의할 점에 대해 다룬다. WebSocket 웹소켓 프로토콜은 웹 어플리케이션의 클라이언트와 서버 간 실시간-양방향 통신을 할 수 있는 ..
Spring을 사용해보았다면 필요한 객체를 주입받는 @Autowired 어노테이션을 알 것이다. 이는 어플리케이션 전체에 공유되는 하나의 객체를 Spring IoC 컨테이너에서 주입받아 사용하는 것인데, 이는 Singleton 패턴이라고 한다. Spring의 @Autowired를 사용하지 않고 모든 곳에서 공통으로 사용될 수 있는 하나의 객체를 만들어보자. 내용 3개의 컨트롤러와 3개의 View가 필요하다. AController, BController, CController /a/index.html, /b/index.html, /c/index.html 전역에서 쓰일 객체 SimpleStorage private Map map을 멤버로 갖는다. map은 key('a', 'b', 'c')로 value(List..
진행하기 앞서... RDB에 Member라는 테이블이 있고, PK는 id이고 salary라는 컬럼이 존재하며 이는 연봉을 나타낸다. 연봉 3000만원 미만의 Member의 salary를 일정 크기만큼 인상한다면 어떻게 SQL을 짜겠는가? 나라면, UPDATE MEMBER SET SALARY = SALARY * 1.3 WHERE SALARY 영속성 컨텍스트에 반영된다. 3. Commit 시점에 변경 감지(Dirty Checking..
진행하기 앞서.. JPA를 한다면 JPQL(Java Persistence Query Language)의 사용은 필수적이다. JPQL에는 경로 표현식이라는 것이 존재하는데, 경로 표현식이란 점(.)을 찍어 객체 그래프를 탐색하는 것이라고 설명할 수 있다. SELECT M.name FROM Member M #상태필드 SELECT M.team FROM Member M #단일 값 연관 경로 SELECT T.memberList FROM Team T #컬렉션 값 연관 경로 위 3가지에 따라 결과가 달라지고, 내부적으로 동작하는게 달라지므로 꼭 주의해서 사용해야한다. 상태필드 : 단순하게 값을 저장하는 필드 연관필드 : 연관 관계를 위한 필드 단일 값 연관 필드 : @ManyToOne, @OneToOne 처럼 xxx..