Loading...

[Spring] JPA의 플러시(flush)

JPA를 사용할 때, 객체를 생성하고 이를 영속성 컨텍스트에 영속시켜 커밋하는 과정까지를 알아봤습니다. 그런데, JPA의 commit()을 호출할 때 항상 발생하는 flush()는 어떤 역할을 하는 녀석일까요? flush() 커밋 메소드를 호출하게 되면 JPA 영속성 컨텍스트에 있는 객체들이 DB로 반영되게 됩니다. 그런데 실제로 commit() 메소드를 호출했을 때 이것이 진행되는 것일까요? 사실은 commit() 메소드가 호출될 때 flush() 메소드가 호출되어지고, 실제로는 flush() 메소드에 의해서 DB에 반영되어집니다. 즉, flush는 영속성 컨텍스트의 내용을 DB에 반영하는 역할을 하는 메소드이며, 쓰기 지연 SQL 저장소에 있는 SQL 쿼리가 DB 서버로 보내지기 때문에 영속성 컨텍스..

2020. 6. 24. 20:04

[Spring] JPA 영속성 컨텍스트 구조로 보는 이점

지난 포스트에서 JPA의 영속성 컨텍스트와 생명 주기에 대해 알아봤습니다. 간단하게 영속성 컨텍스트의 생명 주기의 관계를 통해서 Java로 구현된 객체가 어떻게 DB로 적재되고 삭제되는지를 알 수 있었습니다. 그런데, 영속성 컨텍스트를 왜 사용하는 것일까요? 처음에 저는 이렇게 생각했습니다. JDBC를 사용하려면 어차피 Connection이 생성되어야 하고, 그에 따른 Statement가 만들어져야 하는데, 서버 애플리케이션 특성상 다양한 사용자의 요청을 한 번에 처리해야 하므로, Connection이 여러개 생기게 됩니다. 이 때문에 Connection Pool이라는 것이 있고, 대표적으로 HikariCP가 사용되고 있죠. 그 다음에는 쿼리문을 작성해야 하는데, 이 부분과 함께 커밋까지 해주는 녀석이 ..

2020. 6. 23. 16:23

[Spring] JPA의 영속성 컨텍스트와 생명주기

Spring Framework를 이용하여 웹 애플리케이션이나 서버 애플리케이션을 개발할 때 사용하는 DB 라이브러리가 있습니다. 보통 JDBC 드라이버를 이용하여 DB Connection을 수행하고, 여러 개의 커넥션이 연결하고 끊어지기를 반복하기 위해 재사용할 수 있도록 하는 Connection Pool(DBCP, HikariCP), 그리고 각 도메인에 대한 CRUD를 객체 지향적인 방법으로 프로그래밍 할 수 있도록 하는 ORM이 있습니다. JPA는 여기서 Java 언어의 표준 ORM에 속합니다. Spring boot를 사용하고 있는 요즘에는 Spring 프레임워크에 맞춰져 있는 Spring Data JPA를 사용하는데요. 그런데, Spring Data JPA를 사용하면서 객체에 있는 데이터들이 스스로..

2020. 6. 14. 21:53

[Docker] HAProxy를 이용한 로드 밸런싱

이번 포스트는 지난 포스트에 이어 HAProxy를 이용한 로드 밸런싱을 다뤄보도록 하겠습니다. What is HAProxy ? 이름만 놓고 보면 프록시의 역할을 하는 소프트웨어인 듯 보입니다. 맞습니다. HAProxy의 본래 기능은 Reverse Proxy 역할을 수행하는 소프트웨어이고, 본래는 High Availbility Proxy의 약자입니다. 그러나 이 소프트웨어를 가지고 TCP / HTTP Load Balancer로 사용할 수도 있습니다. nginx랑 다른 점은 무엇일까요? nginx에서도 물론 Reverse Proxy, Load Balancer 기능을 제공하지만 HAProxy는 여기에 Active Health Check 기능을 무료로 제공합니다. (nginx에서도 Active Health Ch..

2020. 6. 10. 12:25

[Docker] nginx web server를 이용한 로드 밸런싱

최근 들어, 쿠버네티스를 활용하려 노력하면서도 가끔은 Docker를 다시 돌아보는 경향이 많아졌습니다. 로드 밸런싱을 하는 방법에는 여러 방법이 있지만 그 중에서도 컨테이너를 이용한 로드 밸런싱은 여러모로 많은 도움이 되었습니다. 무엇보다도 100개 이상의 컨테이너를 생성하기 위해 Docker Compose, Docker Swarm을 많이 사용했었다는 점. 이 부분은 수동으로 인스턴스를 만들어주는 번거로움을 많이 덜어주었고, 그 때문에 컨테이너 기반 운영을 많이 선호했던 점이 기억에 남았습니다. 서론을 접고, 이제 본론으로 넘어가보죠. 이전에 로드 밸런싱에 대한 글을 올렸던 적이 있었습니다. 로드 밸런싱은 실무에서 많이 다루는 기술이지만 이를 적용하기 위해서는 역시 개념에 대해 정확히 알고 사용해야 합니..

2020. 6. 4. 11:48

[Spring boot] 애플리케이션을 Docker 이미지로 만들기 Old & New

Spring boot로 개발한 서버를 운영하기 위해서는 인스턴스에 서버 애플리케이션을 배포해야 합니다. 애플리케이션을 배포하는 방법에는 WAS로 배포하는 방법도 있지만 Docker 컨테이너 이미지를 만들어서 Docker 이미지로 배포하는 방법도 존재합니다. 이번 포스트에서는 Spring boot에서 개발한 애플리케이션을 Docker로 만드는 방법에 대해 이야기 해보도록 하겠습니다. Install Docker 먼저 Docker 이미지를 만들기 위해서 내 컴퓨터에 Docker가 설치되어 있어야 합니다. 아래의 포스트를 참고하여 Docker를 설치해주세요. 2016/07/06 - [Infrastructure/Docker] - Docker, 그것은 무엇이고, 설치는 어떻게할까? Docker, 그것은 무엇이고, ..

2020. 6. 2. 11:17

[Network] Load Balancing (로드 밸런싱)의 개념과 이해

처음 서버를 개발하고, 이를 운영하는 데까지 많은 학습 시간이 필요했습니다. 서버 개발을 위해 Servlet, JSP, Spring을 배우게 되었고, 나아가서는 더 나은 프레임워크 및 차이를 알아보기 위해 Flask, Django, Nest.js 등 다양한 프레임워크를 사용했었죠. 그러나 서버 공부는 이것이 끝이 아니었습니다. 우리는 이러한 서버를 인터넷에 서비스하기 위해 많은 것을 고민해야 했습니다. 서버에서 10, 100명만 접속해서 끝날 일이라면 그냥 서버를 개발하고, 배포하는 것만으로 끝날 일이지만, 만약 수십만 명의 사용자들이 내 서버에 접속해야 한다면 어떤 일이 벌어질까요? 만약, 서버가 멀티 스레드를 사용하고, 각 사용자가 접속할 때마다 스레드를 생성하는 형태를 가지고 있다면, 1만 명 아니..

2020. 5. 27. 20:15

[Spring boot] DAO와 DTO

스프링 부트를 DB와 같이 이용하면서, DAO, DTO라는 단어를 계속 사용하였습니다. 구체적으로 DAO, DTO가 무엇인지 이번 포스트에서 한 번 제대로 다뤄보도록 하겠습니다. DAO DAO는 Data Access Object의 약자로 쉽게 말하자면 DB의 data에 접근하기 위한 객체입니다. 이것이 왜 필요할까요? 우리가 일반적으로 DB에 접근하기 위해서 사용하는 것은 SQL 코드입니다. 그러나 Java에서 직접적으로 SQL 코드를 사용하기 위해서는 Connection을 생성하고 PrepareStatement를 만들고, 직접 SQL 코드를 작성하여 Connection을 닫는 복잡한 과정이 필요합니다. 그러나 우리가 이를 수행할 때마다 커넥션을 생성하는 것부터 시작하여 복잡한 과정을 반복해서 코딩하는 ..

2020. 5. 26. 10:55

[Linux] GRUB Command Line을 이용하여 리눅스 수동 부팅하기

어제, 계속 사용하던 Ubuntu 18.04 LTS를 20.04 LTS 버전으로 업데이트의 계획을 수행하고 있었습니다. 사용했던 IDE 도구, vim과 환경 변수 설정 등을 모두 정리하고, 살펴보니 그다지 많은 설정 값이 적용되어 있지 않았습니다. 사용했던 노트북을 처분하고 새로 PC를 구입한 것이 어느 덧 3개월 정도 되어갔는데, 그 때문에 20.04 릴리즈가 나오기 전까지 기존의 18.04를 설치하고, 간단한 셋팅만 하고 임시 방편으로 사용하기로 했던 것입니다. 어차피 거의 모든 셋팅을 다시해야 했기 때문에 과감하게 새로 설치를 하기로 마음 먹고, Ubuntu Official 홈페이지에서 Ubuntu Desktop 20.04 iso 이미지를 다운로드 받고, iodd를 사용하여 클린 설치를 하였습니다...

2020. 5. 23. 22:58

[Spring boot] Hibernate, JPA 그리고 Spring Data JPA

지난 포스트에서 다뤄 본 JDBC와 Spring JDBC는 자바와 데이터베이스를 연결하기 위한 최초 인터페이스였고, 이들 코드를 개선하기 위해 리팩토링하는 작업들, 연결 세션, 그리고 관심점의 분리 등 다양한 발전된 모습을 보였는데요. 이번 포스트에서는 그에 이어서 Hibernate, JPA, Spring Data JPA에 대해서 알아보도록 하겠습니다. JPA JPA는 Java Persistence API의 약자로 자바에서 관계형 데이터베이스를 사용하기 위한 양식을 정의한 인터페이스입니다. 말그대로 인터페이스이기 때문에 어떤 코드가 구현되어 있는 것은 아닙니다. 단지, Java 라는 객체 지향 프로그래밍 언어에서 관계형 데이터베이스를 객체 지향적으로 설계하기 위한 Best Practice를 JPA라고 하..