Loading...
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. 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. 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. 23. 22:58

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

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

2020. 5. 22. 16:31

[Spring boot] JDBC와 Spring JDBC 그리고 MyBatis

지난 포스트에서 MVC 패턴과 Spring Data Rest를 이용해 간단한 REST API 서버를 개발해보는 시간을 가졌었는데요. 그런데, 우리가 여기에서 DB와 연동하기 위해 사용했던 디펜던시가 있었죠. 바로 Spring Data JPA였습니다. 그런데, 기존의 Spring을 사용했던 분이시나, STS 내지 전자정부프레임워크를 사용하셨던 분들은 JPA보다는 MyBatis에 익숙하실 것입니다. 그러나 MyBatis는 기존의 Spring 처럼 의존성 주입을 XML 파일을 이용해 진행하게 되고, 원하는 데이터를 가져오기 위해 메소드에 DB 쿼리를 질의하는 등의 방식을 이용해야 합니다. 이번 포스트에서는 Spring Application이 어떻게 DB와 연결하여 Spring Data JPA까지 오게 되었는지..

2020. 5. 20. 21:04

[Spring boot] Spring Data Rest를 이용한 REST API 개발 2

지난 포스트에서 Spring Data Rest를 이용해 Domain과 Repository Interface만을 구현하여 HATEOAS에 준수한 REST API 서버를 개발하였습니다. 그러나 REST API를 설계하다보면, HATEOAS의 구조가 마음에 들지 않을 수 있습니다. 예를 들면, 데이터가 비어있을 때 클래스의 정보가 나온다거나, 이 외의 정보를 추가하고 싶다거나, 만약 User 정보를 가져다 준다면, 패스워드 정보와 같은 민감한 정보는 숨겨야할 것입니다. 이번 포스트에서는 Spring Data Rest에 Controller + Service 조합을 넣어서 나만의 REST API를 구현하여 API 서버를 만들어보는 시간을 가져보도록 하겠습니다. RepositroyRestController 지난 포..

2020. 5. 20. 11:13

[Spring boot] Spring Data Rest를 이용한 REST API 개발 1

MVC 패턴에 이어서, 이번에는 Spring Data Rest를 이용하여 REST API 서버를 개발하는 시간을 가져보도록 하겠습니다. MVC 패턴에서는 Domain, Controller, Repository 이렇게 3가지를 이용하였고, 추가로 Service 클래스를 구현하면 더욱 세부적인 처리가 가능하도록 구현할 수 있었습니다. Spring Data Rest는 VC를 생략하고, 오직 Domain과 Repository만을 가지고 아주 쉽게 REST API 서버를 구현할 수 있습니다. 한 번 시작해보도록 하죠. 개발 환경 준비 기존의 MVC 패턴을 사용했던 디펜던시에서 일부 변경하여, Rest Repositores 선택해주면 됩니다. Spring Data Rest에서는 base-path를 지정하여 모든 A..

2020. 5. 19. 21:47

[Spring boot] MVC 패턴을 이용한 REST API 개발

지난 포스트에서 REST API가 무엇인지, 어떻게 설계를 해야하는지에 대해서 다뤄봤습니다. REST API는 HTTP Method를 이용하여 행위를 정하고, URI를 이용해서 리소스를 정하는 방식으로 동작하는 서버였는데요. 이번 포스트에서는 MVC 패턴 + Spring boot 2.x 조합을 이용하여 간단한 REST API 서버를 개발해보도록 하겠습니다. What is MVC ? MVC 패턴에 대해서는 아래의 글에서 다뤄 본적이 있는데요. 혹시 MVC 패턴에 대해 다시 복습해보시거나, 잘 모르신다면, 아래의 글을 보시기 바랍니다. 2016/12/29 - [Programming/JavaFX] - MVC Pattern에 기반한 GUI 라이브러리 JavaFX MVC Pattern에 기반한 GUI 라이브러리 ..

2020. 5. 19. 18:40

[Spring boot] REST API의 기초와 설계

Spring boot가 기존의 Spring에 비해 다양한 설정들을 자동화 시켜 개발자가 설정해야 할 부분을 줄이고, 임베디드 톰캣을 탑재하여 더 쉬운 개발들이 가능해졌다는 것을 알았습니다. 이번 포스트에서는 Spring boot로 서버를 개발해보는 첫 단추인 REST API에 대해 알아보도록 하겠습니다. What is REST API ? REST API란, REST(Representational State Transfer)의 약자로 '대표적인 상태 전달'이라는 의미를 담고 있습니다. 웹과 같은 분산 하이퍼미디어 시스템에서 사용하는 통신 네트워크 아키텍처라고 보시면 됩니다. 본래 웹은 전송 방식으로 HTTP 프로토콜을, 식별 방법으로 URI를 사용하는데, 여기서 혼동하면 안되는 것은 URL과 URI는 다릅..

2020. 4. 23. 12:50

[Spring boot] Spring boot test starter를 이용한 테스트 코드 작성

지난 포스트에서 잠깐, 테스트 코드에 대해 다뤄봤었습니다. 테스트 코드를 이용하면, 확실히 Postman이나 Curl과 같은 테스트 도구없이도 자동화 된 테스트 프레임워크를 이용해서 쉽게 테스트를 할 수 있었죠. 실제로 테스트 프레임워크를 이용한 테스트 코드 구현은 현업에서 많이 이용합니다. 단순하게 내가 구현한 기능 한 단위만 테스트를 하는 것이 아닌 종합적으로 테스트할 때는 이러한 자동화가 필요합니다. 특히 프로젝트가 커지고, 그 규모가 엔터프라이즈급이 되면 애플리케이션 코드도 방대해지고, 그렇게 되면 테스트해야 할 함수도 많아지겠죠. Spring boot Test Spring boot에서는 기본적인 테스트 스타터를 제공하는데, 이 모듈에는 Junit 뿐만 아니라 왠만한 Java 계열의 언어에서 사용..

2020. 4. 22. 12:23

[Spring boot] 나만의 환경 설정 만들기

지난 포스트에서 자동 환경 설정과 개발, 프로덕션, 테스트 환경을 나누는 방법에 대해 포스팅하였습니다. 이번 포스트는 그거에 이어서, 나만의 환경 설정 파일을 만드는 방법에 대해 알아보겠습니다. @Value 우리는 환경설정에서 Property의 키를 사용하여 특정한 값을 호출할 수 있었습니다. 하지만 이 Key로 우리가 무엇을 할 것인지를 프로그래밍 코드에서 구현해야 하며, 일단 그러기 위해서는 우리는 이 값을 어떻게 가져올 수 있는지를 알아야 합니다. 그럴 때 사용하는 것이 @Value 어노테이션입니다. # application.yml server: port: 8080 spring: profiles: active: dev property: app: hello: hello world 먼저 우리는 서버의 ..

2020. 4. 21. 12:18

[Spring boot] 환경 설정의 동작 원리와 애플리케이션 환경 나누기

Spring boot 프로젝트를 생성하고 난 후, Embedded Tomcat을 이용해 쉽게 애플리케이션을 시작해보고, 테스트할 수 있는 것 까지는 좋은 것이긴 한데, Embedded Tomcat에 대한 포트 주소 등의 설정은 어떻게 하는 것일까? Property 기존의 Spring에서는 모든 설정을 XML 파일로 사용했다면, Spring boot에서는 Embedded Tomcat, Application 설정 관련 및 기타 정적인 값을 키 값 형식으로 관리합니다. Spring boot 프로젝트를 생성하면, 자동 만들어지는 application.properties는 이러한 설정을 해주는 파일입니다. 현재 애플리케이션을 실행하면 8080 포트로 설정되지만, 이 포트 주소를 바꾸고 싶다면, 아래와 같이 설정을..

2020. 4. 21. 10:59

[Spring boot] 다양한 어노테이션을 활용한 HTTP API 구현

지난 포스트에서 IntelliJ IDEA를 이용하여 Spring boot 프로젝트를 만드는 시간에 대해 알아봤습니다. 확실히 기존의 Spring에 비하여 프로젝트 생성 절차가 간단하고, 개발 환경 설정도 까다롭지 않은 모습이었습니다. 이번 포스트에서는 그에 이어서 간단한 HTTP API를 구현하는 시간을 가져보도록 하겠습니다. Hello World 가장 먼저 애플리케이션이 제대로 실행되는지 테스트하는 방법은 어떤 문구를 출력해보는 방법이 가장 좋겠죠? REST API에서 파라미터도 받지 않고, 가장 간단한 메소드로 사용할 수 있는 GET 메소드를 이용해 Hello World를 출력해보도록 하겠습니다. package xyz.neonkid.blogexample import org.springframework..

2020. 4. 21. 10:33

[Spring boot] IntelliJ IDEA를 이용한 Spring boot 프로젝트 시작

기존의 Java 언어를 이용해서 웹 개발을 위해서는 Tomcat, Jetty 등과 같은 Servlet Container를 설치하고, 프로젝트 내에 환경을 구성해야 했고, 대표적인 Java Application Framework인 Spring 역시 개발 환경 설정이 만만치 않다는 이유로 Java 언어를 잘 사용하는 분이 아닌 분들은 대부분 웹 개발을 위해 비교적 개발 환경 설정이 쉬운 Node.js의 Express나 Python의 Django 등을 많이 사용하죠. Spring boot Spring boot는 이러한 Spring의 개발 환경 설정의 어려움과 부담을 덜어주기 위해 개발 환경 설정을 최소화 하고, 개발자가 비즈니스 로직에 집중할 수 있도록 도와줍니다. 먼저 Spring boot의 특징부터 간단히..

2020. 4. 6. 13:41

[Algorithm] - 2019 Kakao Winter internship Coding test 문제 풀이

2년 전부터 계속, 시간이 날 때마다(그 시간이 얼마 되지 않지만..) 틈틈이 알고리즘 문제 풀이를 계속 이어가고 있었습니다. 다양한 문제들을 보았고, 어려운 문제, 생각이 날 것 같으면서도 뇌정지가 오는 문제, 쉽게 풀만한 문제들 다양한 문제들이 존재하였습니다. 그러던 중, 작년 겨울에 재미삼아 카카오 코딩 테스트 문제를 풀게 되었습니다. 문제 난이도는 생각한 것보다는 조금 어려운 수준에 해당했으며 어차피 코딩 테스트에서 좋은 성적을 거두지 못했더라도 차후에 문제 풀이 해설이 올라오기 때문에 가벼운 마음으로 시험에 임했습니다. 하지만 몇 달이 지나도 해당 코딩테스트에 대한 문제 풀이 해설은 보이지 않았고, 그 해설을 최근에서야 발견하게 되었습니다. (그것도 Google 검색이 친절하게 이것이 있다는 걸..

2020. 3. 28. 20:31

[Spring Cloud] - 7. Hystrix를 이용한 Circuit Breaker (기본편)

지난 포스트에 이어서 Spring Cloud에서 Circuit Breaker를 구현할 수 있는 첫 번째 파트를 들어가보도록 하겠습니다. Hystrix Hystrix는 Spring Cloud 스택에서 제공하는 Circuit Breaker 중 하나입니다. Netflix에서 개발했으며 현재는 Spring Cloud의 표준 Circuit Breaker로 자리 잡고 있죠. 기본적으로 Hystrix는 위와 같은 형태로 동작합니다. 브라우저 혹은 모바일에서 어떤 API 요청이 들어왔을 경우, 해당 서비스의 엔드포인트가 호출되는데, 이 때 서비스에 오류가 발생했거나 응답이 없을 경우, 이후 이용자에게 장애가 전파되지 않고, 미리 정의된 오류를 브라우저 혹은 모바일에서 전송하게 되어 오류 전파를 막아주게 됩니다. 그러면..

2020. 2. 8. 22:31

[Spring Cloud] - 6. Eureka를 이용한 서비스 검색

MSA로 설계된 웹 애플리케이션은 그 인스턴스가 서비스별로 나누어져 있고, 만약 이를 로드 밸런싱을 이용해 여러 서비스를 분산 처리하게 된다면, 서로 다른 인스턴스가 여러 개 생기게 되며, 그렇게 되면 API 요청마다 적절한 인스턴스의 Endpoint를 매겨줘야 합니다. Service Discovery는 이러한 문제를 해결하고자, Server-Client 방식과 유사한 Self-Registration Pattern을 이용해 자신의 서비스를 중앙의 Registry에 등록하고, 이를 요청할 때마다 알맞는 Endpoint를 매칭해준다는 것을 알았습니다. Eureka Spring Cloud 스택에서 이러한 역할을 하는 대표적인 모듈로 Eureka가 있습니다. Eureka는 Netflix OSS 중 하나로 Spr..