실습/리눅스 서버 + 스프링 부트61 OSIV JPA를 사용하다보면, 종종 특수한 상황에서 LAZY LOADING을 사용해야하는 경우가 있다. 한 번에 관계 데이터까지 가져오기에는 데이터가 너무 대용량인 경우 너무 복잡한 관계를 가진 데이터인 경우 자주 사용하지 않는 데이터를 관계로 가진 경우 그런데 이렇게 LAZY LOADING을 채택해서 Domain 클래스를 구성했을 때 종종 발생하는 에러가 있다. 바로 LazyInitializationException 에러이다. 지연 로딩은 객체가 실제로 필요한 시점에 DB에서 데이터를 로딩하는 방식이다. 그런데 위의 에러는 DB에서 데이터를 로딩해서 세션(영속성)이 종료된 후인데, 다시 한 번 DB에 접근해서 필요한 데이터를 불러오려고 해서 발생하는 문제이다. 즉, View에서 데이터를 보여줄 때 이미 DB에.. 2023. 7. 14. [SPRING JPA] N+1 문제 N+1 문제 연관 관계가 설정된 엔티티 조회 시 조회된 데이터의 갯수(N)만큼 연관관계의 조회 춰리가 추가로 발생해서 데이터를 읽어오는 현상이다. 처음 이 말을 들었을 때 무슨 말인지 알지 못했다. 하지만 아래의 예시를 들면 이해가 편할 것 같다. 우선 아래와 같은 두 개의 테이블이 존재한다고 가정한다. CREATE TABLE IF NOT EXISTS school ( school_name VARCHAR(100) PRIMARY KEY ); CREATE TABLE IF NOT EXISTS student ( stdnt_name VARCHAR(100) PRIMARY KEY, school_name VARCHAR(100) NOT NULL, CONSTRAINT FK_SCHL FOREIGN KEY(school_name.. 2023. 7. 4. Spring Boot + Mybatis 현재 회사에서 주로 하는 프로젝트는 빅데이터 혹은 사물인터넷 관련이다. 그러다보니 주로 데이터 저장에는 NoSQL을 사용하게 되고 RDB를 사용하면 동적으로 DDL을 생성해서 테이블을 create 하는 방법을 사용하고 있다. (빅데이터나 IoT는 데이터 형식에 따라 동적으로 테이블 구조가 결정되기 때문) 첫 프로젝트에서는 JPA를 사용해 개발을 진행했었다. 그 때 JPA의 편리한 사용법에 매료됐었지만, 아쉽게도 그 이후로는 JPA를 쓸 일이 없었다. 이유라면 위에서 언급했듯, 동적으로 DDL을 생성해서 테이블을 관리하기에 사전에 테이블 구조가 정해져 있어야 하는 JPA는 사용을 할 일이 없었다. 그래서 대신 MyBatis를 주로 사용했고, 오늘은 Spring Boot에서 MyBatis의 사용법을 포스팅 .. 2023. 7. 2. Spring Boot + JSP 요즘 여러 회사의 채용공고들을 살펴보고 있는데, 느낀 점이 아직은 Spring Boot보다는 Spring Framework가 많이 사용되고, Thymeleaf 보다는 JSP가 많이 사용된다는 점이었다. 그래서 가만히 생각을 해보니, 회사에서 Thymeleaf만 사용하다보니 JSP를 전부 까먹었다는 사실을 알아냈다. 언제 jsp를 사용하게 될 지 모르므로, jsp의 사용법을 간단하게 기재해서 저장해놓고자 한다. JSP Java Server Pages (JSP)는 웹 개발을 위해 사용되는 자바의 기술이다. HTML과 Java를 결합해서 사용할 수 있는데, 서버에서 실행해서 생성된 결과를 html로 사용자에게 전달한다. 동적인 웹 페이지를 만들때 사용된다. JSP를 사용함에 있어 장점과 단점은 아래와 같다. .. 2023. 7. 2. OAuth2.0 + Spring Boot (Google, Kakao, Naver 연동) 회사 프로젝트에서 API Gateway를 개발하면서 로그인과 토큰 발급을 위해 외부 OAuth에 연동시켰다. 단 이 때 자체 로그인 기능은 배제된 상태로 개발이 진행됐다. 그런데 최근 자체 로그인 기능을 추가하며 앞서 작성했던 코드를 다시 열었는데, 어떻게 작성했는지 기억이 나지 않았다. 역시 사람은 어딘가에 적어놓지 않는다면 까먹는구나 라는 사실을 다시 한 번 깨달았고, 맨날 적어야지.. 하면서 절대 안적어놓는 스스로의 게으름을 반성하고자 Spring Boot에서 OAuth2.0을 연동하는 방법을 적어놓을까 한다. OAuth2.0 OAuth2.0은 인증을 위한 산업 표준 프로토콜이다. 사용자에가 굳이 비밀번호를 공유하지 않고도 사용자 대신 다른 서비스에 접근할 수 있는 권한을 부여하는데 사용된다. OA.. 2023. 7. 1. application 파일에서 자료구조(list, map) 사용법 개발을 하다보면 시스템 설정 같은 부분은 당연하게도 application.properties (혹은 yml)에서 담당하게 된다. 대부분의 설정은 String, Numeric 형태의 단일 값이지만, 가끔은 list, map 와 같은 형태로 사용을 하게 될 때도 존재했다. 이런 상황에서는 항상 구글링을 통해 해결을 했다. 그리고 그 때마다 언젠가는 블로그에 적어놓고 굳이 찾아다니지 말고 바로 적용해서 써야지... 라는 생각을 했었다. 그렇게 생각만 한지 몇 달이 되어 드디어 해당 포스팅을 작성해서 방법을 저장해놓을까 한다. 포스팅은 application.properties를 기반으로 작성한다. List 우선 List를 사용하는 방법이다. appliction.properties에서는 쉼표(,)를 이용해서 여러.. 2023. 5. 28. application.yml 적용법 application.properties vs application.yml Spring Boot에서는 외부에서 환경 변수를 삽입할 수 있는 application.properties와 application.yml을 제공한다. application.properties는 key-value 형식으로 환경 변수를 설정할 수 있다. 그에 반해 yml은 계층적으로 환경 변수를 설정할 수 있다. 아무래도 properties보다 직관적으로 관리할 수 있고, key를 중복해서 작성해지 않아도 된다는 장점 때문에 최근 프로젝트에서는 yml을 주로 사용하게 되었다. 이에 properties를 yml로 바꾸는 방법과, 더불어 다중 profile을 적용하는 방법을 포스팅해놓고자 한다. properties 파일을 yml 파일로 전.. 2023. 1. 15. 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. 이전 1 2 3 4 5 6 다음