본문 바로가기

실습/리눅스 서버 + 스프링 부트54

JPA에서 외래키 사용 오늘은 JPA에서 외래키를 사용하는 방법을 작성해놓을까 한다. DB를 설계할 때 테이블간 관계 표현을 위한 외래키 사용은 필수이다. JPA에서는 이러한 외래키를 클래스 안에 클래스를 선언함으로써 사용 가능하도록 기능을 제공하고 있다. 아래와 같은 DB가 있을 경우, 다음과 같이 클래스를 생성하면 JPA를 사용한 외래키를 생성할 수 있다. Parent.java @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor @Table(name="parent_table") public class Parent { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="parent_id", nul.. 2022. 12. 13.
[Shell Script] 프로그램 실행/종료 스크립트 만들기 다음 포스팅에서 이어진다. https://123okk2.tistory.com/387 [Shell Script] 쉘 스크립트 문법 쉘 스크립트의 최상단은 다음과 같은 명령어로 시작되어야 한다. #!/bin/sh 해당 명령어는 스크립트를 실행할 쉘을 지정하는 문법이다. 이제부터 쉘 스크립트의 사용법을 간략하게 적어보고자 한 123okk2.tistory.com 프로그램을 만들었으면 클라이언트 혹은 서버에 해당 프로그램을 배포해야 한다. 하지만 동일 프로그램을 실행시키더라도 실행하는 환경에 따라 application.properties (혹은 yml), bootstrap.properties 등의 설정 파일의 값은 바뀌어야 한다. 물론 이 부분은 윈도우는 7Zip등을 통해, 리눅스는 vim 등을 통해 얼마든지 수.. 2022. 9. 18.
[Shell Script] 쉘 스크립트 문법 쉘 스크립트의 최상단은 다음과 같은 명령어로 시작되어야 한다. #!/bin/sh 해당 명령어는 스크립트를 실행할 쉘을 지정하는 문법이다. 이제부터 쉘 스크립트의 사용법을 간략하게 적어보고자 한다. 쉘 스크립트는 일반 함수형 프로그래밍 언어와 마찬가지로 사용할 수 있다. 가장 먼저 알아볼 것은 변수 선언 및 입출력이다. 변수 선언 및 입출력 변수 선언은 일반적으로 다음의 세 가지 경우로 나뉜다. 선언 시 고정값을 입력하는 방법 쉘 스크립트 실행 시 파라미터를 받아 사용하는 방법 사용자에게 직접 입력받아 사용하는 방법 가장 먼저 고정값을 이용하는 방법은 아래와 같다. num_var=123 chr_var='123' *이 때 = 양 옆에는 띄어쓰기가 없어야 함을 주의한다. 출력은 echo 명령어를 이용하며, 변.. 2022. 8. 16.
JPA 페이징 게시판에 약 100,000개의 게시글들이 등록되어 있다고 가정한다. 이 경우 굳이 사용자에게 100,000개의 게시글들을 전부 제공해야 할까? 만약 그런다면 속도가 느린 것은 당연하고, 한 페이지 내에서 모든 게시글들을 보여주기 어려워 사용자 편의성이 크게 떨어질 수 있다. 페이징이란 이러한 경우 사용하는 것으로, 게시판을 페이지 단위로 나누어 사용자게에 제공하는 작업이다. 페이징은 원래대로라면 DB 파라미터에 LIMIT 등의 조건을 추가하면 구현할 수 있다. 하지만 DB마다 조금씩 그 방식에 차이가 있기 마련인데, ORM인 JPA는 이러한 페이징도 DB의 종류에 관계없이 쉽게 구현할 수 있도록 Pageable이라는 클래스를 제공한다. 즉 JPA는 Pageable이라는 클래스를 파라미터로 주고받으며 위의.. 2022. 7. 25.
application.properties (yml) 암호화 신입사원분을 대상으로 하는 OJT 과정 중 "Spring Boot 기반 개발" 과정을 담당하게 되었다. 이에 간단한 자료와 예제 프로젝트를 작성하여 OJT를 진행하였다. application.properties (yml)에 대한 설명을 하던 중 다음과 같은 질문을 받았다. "저 application.properties 내 DB 정보는 외부에 유출이 되면 안될텐데, 저걸 저렇게 그대로 작성해도 괜찮나요?" application.properties 내 정보는 특정 라이브러리를 사용하면 암호화할 수 있다는 것 정도는 알고 있었다. 하지만 그 라이브러리가 무엇인지, 어떻게 사용할 수 있는지는 미처 알지 못했었다. 그래서 위 질문에 제대로 된 답변을 내놓지 못했다. OJT가 끝난 후 위에서 받은 질문은 언제든지 .. 2022. 7. 25.
Spring WebFlux Filter 처음으로 Spring Webflux를 이용한 프로젝트에 투입되었다. 해당 프로젝트의 요구사항 중에는 Request의 특정 Header에 URL이 들어오는데, 해당 URL에 접속하여 그 안의 정보를 파싱해서 DB에 유지해야 하는 요구사항이 존재했다. 이 요구사항을 식별했을 때 "이 정도면 Filter를 사용하면 쉽게 해결되겠는데?" 라는 생각이 들었고, 평소와 다를 것 없이 Filter를 작성하려고 했으나 실패했다. Spring Web과 달리 Spring Webflux는 별도의 방식으로 Filter를 제공하기 때문이았다. Spring Webflux에서 Filter를 사용하기 위해서는 org.springframework.web.server.WebFilter를 상속받은 클래스를 생성해야 한다. 해당 클래스는 .. 2022. 7. 25.
Spring Security rememberMe (자동 로그인) 웹 사이트들을 보면 종종 로그인 정보 저장, 내 정보 저장 등 사용자의 정보를 기억하고 추후 웹 사이트 재방문 시 별도의 로그인 과정 없이 인증이 수행되도록 하는 기능이 존재한다. 문득 Spring의 인증/인가를 담당하는 Spring Security도 위의 기능을 제공하는지 궁금해졌고, 찾아본 결과 rememberMe라는 이름으로 해당 기능을 간편하게 구현할 수 있도록 제공한다는 것을 알아냈다. 그래서 해당 기능을 공부해보았고, 추후에 있을 프로젝트에서 언제든지 해당 기능을 쉽게 구현할 수 있도록 코드와 사용법을 정리해놓으려고 한다. 메인 주제가 Spring Security이기에 이전에 작성한 Spring Security 포스팅에서 이어서 작성한다. 가장 먼저 해야할 일은 HTML에 자동 로그인을 위한 .. 2022. 7. 25.
Ehcache 아래 포스팅에서 이어진다. https://123okk2.tistory.com/326 Spring Boot 캐시 사용 개발이 완료된 프로그램이 있다. 해당 프로그램은 필요 이상의 인프라 (DB, RabbitMQ 등)를 요구했고, 이 점으로 인해 설치가 어렵고 프로그램의 복잡도가 높았다. 그래서 해당 프로그램의 인프라 123okk2.tistory.com 기본적으로 아무런 선언 없이 캐시를 사용하면 ConcurrentMapCacheManager가 빈으로 등록되어 사용된다. @Autowired CacheManager cacheManager; public String getCacheType() { return cacheManager.toString(); } 프로젝트를 만들어 위의 함수를 만든 다음 테스트로 함수를.. 2022. 4. 2.
Redis In Java_메시지 큐 https://123okk2.tistory.com/344 Redis In Java_자료구조 Redis 레디스는 인메모리 기반의 키-값 데이터 저장소이다. 인메모리의 특성상 아주 빠른 속도를 가지고 있고, 이에 따라 자주 사용하는 데이터 정도를 저장하는 간단한 데이터베이스 정도로 생 123okk2.tistory.com 윗글에서 이어서 포스팅을 진행하자. 남이 만든 프로그램을 인수인계 받는 것은 참 어려운 일이다. 구조를 하나하나 다 뜯어보고, 코드 내부도 전부 읽어봐야 하니까 말이다. 아주 힘든 일이지만 그래도 그만큼 얻는 건 많은 것 같다. 만약 이번에 해당 프로그램을 인수인계 받지 않았다면 Redis를 메시지 큐로도 활용할 수 있다는 사실을 알지 못했을 테니까. *함께 설치되는 인프라 중에 Rabbit.. 2022. 3. 20.
Redis In Java_자료구조 Redis 레디스는 인메모리 기반의 키-값 데이터 저장소이다. 인메모리의 특성상 아주 빠른 속도를 가지고 있고, 이에 따라 자주 사용하는 데이터 정도를 저장하는 간단한 데이터베이스 정도로 생각을 하고 있었다. 하지만 실무에서 본 Redis는 그 쓰임새가 생각보다 많았다. 기본적으로 키-값 데이터 저장소라는 이야기를 듣고 아, 그냥 캐시에다 Map을 저장하는 거구나 라고 생각을 했었다. 그리고 이 Map은 내 기준에서는 키와 값 두 개의 스트링으로 이루어진 데이터일 뿐이었다. 하지만 의외로 Value에는 다양한 자료구조가 탑재될 수 있었다. 물론 여기까지는 어느정도 Map을 생각했을 때 당연하다고 생각되는 부분이었지만, 보다 신기했던 기능은 Redis가 RabbitMQ, Kafka와 같은 메시지 큐로써의 .. 2022. 3. 20.
Spring Cloud Config 타인이 만든 프로그램을 유지보수 및 업그레이드 하면서 궁금한 점이 생겼다. 그것은 바로 Config-Server 라는 이름의 프로그램이었다. 처음에는 이 또한 프로그램의 일부로, 어떤 로직을 수행하는 것인줄 알았다. 하지만 막상 코드를 열어보니 안에는 아무 내용이 없었고, 그저 설정 파일과 디폴트로 만들어지는 메인 클래스만이 존재할 뿐이었다. 그래서 이게 뭘까... 도대체 왜 만든 걸까...? 하고 찾아보다 Spring-Cloud-Config 라는 개념을 처음으로 알았고, 앞으로 유지보수를 위해서도 알아야 할 내용이라는 생각이 들어 공부를 시작했다. Spring Cloud Config 어플리케이션에는 당연히 application.properties, application.yml, bootstrap.pro.. 2022. 3. 13.
Spring Boot 캐시 사용 개발이 완료된 프로그램이 있다. 해당 프로그램은 필요 이상의 인프라 (DB, RabbitMQ 등)를 요구했고, 이 점으로 인해 설치가 어렵고 프로그램의 복잡도가 높았다. 그래서 해당 프로그램의 인프라 의존도를 낮추기 위한 수정 작업을 수행했다. 그 중 하나는 Redis에 저장하는 정보를 캐시에 저장하여 Redis에 대한 의존성을 없애는 작업이었다. 아래는 해당 작업을 위해 공부한 내용이다. Cache 캐시는 데이터의 값을 복사해놓는 임시 저장소이다. 주 메모리에 비해 데이터에 접근하는 시간이 짧기 때문에, 자주 사용하는 정보를 임시로 저장해놓고 사용한다. 스프링에서 Cache는 아래의 어노테이션을 사용하면 쉽게 사용할 수 있다. @Cacheable @CachePut @CacheEvict 데이터 준비 실습.. 2022. 3. 11.