728x90

springboot 49

[Kotlin] 코틀린 + 스프링부트 + JPA 사용해보기

코틀린 + 스프링부트 + JPA 사용해보기 코틀린과 스프링부트 JPA를 사용해서 기본적인 Create, Read를 만들어보았다. 1. 프로젝트 생성 코틀린, gradle-kotlin 선택하고 java도 11로 선택 후 다음 선택 라이브러리 선택 Thymeleaf는 넣어도되고 빼도 된다. 2. 컨트롤러 @Controller class TodoController { @GetMapping("/") fun home(model: Model): String { model["title"] = "Todo List" return "todo" } } 화면은 Controller에서 만들어준다. - RestController @RestController @RequestMapping("/api/v1") class TodoRes..

[Spring] 스프링 부트에서 Spring Rest Docs 적용하기

Spring Rest Docs 적용하기 예전에 Swagger 사용법을 정리한 포스팅을 작성했었다. [Spring] 스웨거(Swagger) 라이브러리 [Spring] 스웨거(Swagger) 라이브러리 기존에는 api 테스트를 위해서 포스트맨을 사용했는데, 스웨거는 서버로 요청되는 api 리스트를 html 화면으로 문서화해서 테스트할 수 있는 라이브러리이다. @RestController를 읽어서 api를 분석해서h devhooney.tistory.com 강의를 들으면서 정리를 했던 것인데, 이번에도 강의를 들으면서 Spring Rest Docs를 내 프로젝트에 적용을 해봤다. Swagger와 역할은 비슷하지만, 테스트 코드를 강제한다는 특징이 있다. 현업에서는 보통 두 개의 라이브러리를 혼용한다고 한다. 1..

[Spring] 스프링 부트에서 크롤링 하기

스프링 부트에서 크롤링 하기 회사에서 크롤링을 할 일이 있어서 Java로 크롤링 하는 방법을 구글링으로 알아보았다. 그 과정을 간단하게 정리했다. 먼저 라이브러리 설치한다. - jsoup 설치 implementation 'org.jsoup:jsoup:1.15.3' - 크롤링 하고 싶은 url 확인 회사에선 다른 url을 크롤링 했지만, 여기선 예시로 네이버 해외축구 페이지를 크롤링 해보려고 한다. https://sports.news.naver.com/wfootball/index.nhn 해외축구 : 네이버 스포츠 스포츠의 시작과 끝! sports.news.naver.com - 크롤링 할 데이터 위치 확인 - 코드 작성 private static void crawling() { String URL = "ht..

[Spring] 스프링 부트에 캐시 적용하기

스프링 부트에 캐시 적용하기 캐시(Cache) - 자주 사용하는 데이터를 미리 보관해둔 임시 장소 - 비교적 저장 공간이 적고, 전체적인 비용이 비쌈 - 빠른 IO를 통해 성능적 이점을 갖는다. - 도중에 변경될 일이 없는 DB 조회 값이나 자주 호출되는 데이터에 사용 스프링 부트에서의 캐시 - 스프링 부트에서 사용할 수 있는 캐시는 대부분 JSR-107를 따른다.(JSR: Java Specification Requests, 자바 플랫폼에 대한 규격을 제안하거나 기술한 것을 의미, JSR-107은 JCACHE에 대한 내용) - JSR-107을 따르는 캐시를 사용하면 어떤 구현체 캐시를 사용하는지에 관계없이 추상화를 지원 로컬 캐시와 글로벌 캐시 로컬 캐시 - 로컬에서만 사용하는 캐시 - 외부 서버와 트랜..

[Spring] 테스트 커버리지 확인하기

테스트 커버리지 확인하기 코드 커버리지 - 소프트웨어의 테스트 수준이 충분한지 표현할 수 있는 지표 중 하나 - 테스트를 진행했을 때 해당 코드가 실행되었는지를 표현하는 방법 - 많은 코드 커버리지 도구가 있다. Jacoco란? - Java 코드의 커버리지를 체크하는 라이브러리 - 작성된 코드의 테스트 커버리지(Test Coverage)를 측정하는 도구 - Runtime으로 Test Case를 실행하여 Coverage를 체크하는 방식 - 테스트 코드를 통해 테스트를 실행하고 그 결과를 html, xml, csv 등의 형식으로 Report를 제공 블랙 박스 테스트 / 화이트 박스 테스트 블랙 박스 테스트 - 소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 동작을 검사하는 방식 - 다양한 값을 입력하여..

[Docker] Spring 프로젝트를 Docker를 이용해서 배포하기

Docker를 이용해서 Spring 프로젝트를 배포해보려 한다. 먼저 AWS 계정이 있어야하고, 인스턴스가 있어야한다. 1. ec2를 업데이트하고 프로젝트를 받기 위해 git을 설치 한다. # ec2 업데이트 sudo yum update -y # git 설치하기 sudo yum install git 2. 자바를 설치한다. # aws coreetto 다운로드 sudo curl -L https://corretto.aws/downloads/latest/amazon-corretto-11-x64-linux-jdk.rpm -o jdk11.rpm # jdk11 설치 sudo yum localinstall jdk11.rpm -y # jdk version 선택 sudo /usr/sbin/alternatives --con..

개발/Docker 2022.10.05

[Spring] 동시성 이슈 해결 방법 (4)

지난번 포스팅과 코드를 이어간다. https://devhooney.tistory.com/110 [Spring] 동시성 이슈 해결 방법 (3) 지난번 포스팅과 코드를 이어간다. https://devhooney.tistory.com/109 [Spring] 동시성 이슈 해결 방법 (2) 지난번 포스팅과 코드를 이어간다. https://devhooney.tistory.com/108 [Spring] 동시성 이슈 해결 방.. devhooney.tistory.com 메모리 DB인 Redis를 활용하여 데이터 정합성을 맞추는 방법을 알아보자 Lettuce Redisson 2가지가 있다. Lettuce - Lettuce는 setnx 명령어를 활용하여 분산락을 구현한다. 키와 밸류를 set할 때 기존 값이 없을 때만 se..

[Spring] 동시성 이슈 해결 방법 (3)

지난번 포스팅과 코드를 이어간다. https://devhooney.tistory.com/109 [Spring] 동시성 이슈 해결 방법 (2) 지난번 포스팅과 코드를 이어간다. https://devhooney.tistory.com/108 [Spring] 동시성 이슈 해결 방법 (1) 간단한 재고 시스템으로 알아보는 동시성 이슈 Stock @Entity public class Stock { @Id @GeneratedVal.. devhooney.tistory.com DB를 활용하여 데이터 정합성을 맞추는 여러가지 방법을 알아보려한다. Mysql(mariaDB)를 활용한 방법은 3가지가 있다. Pessimistic Lock (exclusive lock) Optimistic Lock Named Lock - Pes..

[Spring] 동시성 이슈 해결 방법 (2)

지난번 포스팅과 코드를 이어간다. https://devhooney.tistory.com/108 [Spring] 동시성 이슈 해결 방법 (1) 간단한 재고 시스템으로 알아보는 동시성 이슈 Stock @Entity public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long productId; private Long quantity;.. devhooney.tistory.com 지난번에 race condition을 방지하기 위해서 데이터에 하나의 쓰레드만 접근하도록 하는것이 방법이었다. 이외에도 다른 방법들이 있는데, 하나씩 정리해보려고 한다. 자바에서 지원하는 방법으로 문제를 해..

[Spring] 동시성 이슈 해결 방법 (1)

간단한 재고 시스템으로 알아보는 동시성 이슈 Stock @Entity public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long productId; private Long quantity; @Version private Long version; public Stock(){ } public Stock(Long productId, Long quantity) { this.productId = productId; this.quantity = quantity; } public Long getQuantity() { return quantity; } public void decrease..

728x90