전반적

https://minkukjo.github.io/study/docs/spring/jpa/kotlin-jpa-guide/

 

Kotlin JPA 개발 가이드 | 도전하는 개발자

JPA With Kotlin

minkukjo.github.io

 

 

코틀린 스프링 부트에 QueryDsl 적용

https://dev-gorany.tistory.com/362

 

[Spring Boot] Kotlin Querydsl 적용 (with. Mono repo, Multi module)

[Spring Boot] Mono Repo, Multi Module (with. Gradle Kotlin DSL) Intro 개인 프로젝트 정도의 규모라면 하나의 프로젝트 안에 api, web, admin 등이 모두 들어가있어도 커버가 되지만, 규모가 커지면 각각 개별..

dev-gorany.tistory.com

 

https://velog.io/@gosgjung/kotlin-DSL-gradle-QueryDSL-%EC%84%A4%EC%A0%95

 

(chartnomy) kotlin DSL gradle - QueryDSL 설정

아직 QueryDsl을 사용하는 코틀린 DSL 기반 Gradle 을 사용하는 Spring Boot 서적들이 없는 것 같았다. (물론 내가 못 찾는 거일수도 있다는거). 인터넷을 찾아가면서 kotlin 기반 gradle 파일에서 querydsl 을

velog.io

 

withConvention deprecated 처리

https://pasudo123.tistory.com/472

 

20210828 [gradle] The concept of conventions is deprecated. Use extensions instead

개요 querydsl 설정하던도중 Qclass 경로 설정에 대한 deprecated 뭐 만나서 그냥 잠깐 삽질한 경험 공유. gradle version 7.x 이상부터 확인된다. 문제코드 withConvention 을 상세 클릭하면 아래와 같은 내용이..

pasudo123.tistory.com

 

spiring boot jpa entity 작성하기

https://chana.tistory.com/entry/spring-boot-kotlin-kotlin%EC%9C%BC%EB%A1%9C-JPA-entity-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0

 

[spring boot / kotlin] kotlin으로 JPA entity 작성하기

Spring boot 프레임워크에서는 @Entiy 어노테이션을 사용해서 어플리케이션의 엔티티 객체와 데이터베이스 테이블을 매핑해 객체지향적으로 데이터베이스의 데이터를 관리할 수 있다. JPA 엔티티를

chana.tistory.com

 

https://effectivesquid.tistory.com/entry/Kotlin-JPA-%EC%82%AC%EC%9A%A9%EC%8B%9C-Entity-%EC%A0%95%EC%9D%98

 

Kotlin + JPA 사용시 Entity 정의

클래스 정의 제약 사항 JPA를 사용하게 되면 대부분 Hibernate를 구현체로 사용하게 된다. Hibernate를 구현체로 사용하게 되면 Entity로 사용할 클래스에 몇 가지 제약사항이 존재한다. https://docs.oracle.c

effectivesquid.tistory.com

 

querydsl 커스텀

https://gksdudrb922.tistory.com/125

 

[Querydsl] 스프링 데이터 JPA가 제공하는 Querydsl 기능

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/ 실전! Querydsl - 인프런 | 강의 Querydsl의 기초부터 실무 활용까지 한번에 해결, 본 강의는 자바 백엔드 개발의 실전 코스를 완성하는 마지막 강..

gksdudrb922.tistory.com

 

https://blog.sapzil.org/2018/08/26/kotlin-jpa-pitfalls-embeddable/

 

Kotlin에서 JPA 사용할 때 주의할 점 (2) - Embeddable, IdClass | The Sapzil

Kotlin에서 JPA 사용할 때 주의할 점을 쓴 이후로 직장에서 하는 프로젝트에도 Kotlin + JPA를 사용하게 되었습니다. 그러다보니 좀 더 고급 기능을 사용하게 되고 또 여러가지 새로운 어려움에 부딪

blog.sapzil.org

 

 

// n개의 요소를 가진 배열 생성하기
const arr = Array(n);

// 배열에 동일한 데이터 채우기
// 모든 요소를 5로 채울 경우
arr.fill(5);

 

 

0. 준비물

SSH 접속 툴 : Mobax

Putty와 FileZilla를 합쳐놓은 듯한 프로그램이다.

사용하기 편하고 무료버전도 충분하다. 다운로드하자. 

https://mobaxterm.mobatek.net/download.html

 

MobaXterm free Xserver and tabbed SSH client for Windows

The ultimate toolbox for remote computing - includes X server, enhanced SSH client and much more!

mobaxterm.mobatek.net

 

참고 내용를 읽어보고 시작하자.

https://ondolroom.tistory.com/815

 

도커 설치 및 기본 이용

참고 영상 youtu.be/hWPv9LMlme8 www.yalco.kr/36_docker/ 가장 쉽게 배우는 도커 어려운 프로그래밍 개념들을 쉽게 설명해주는 유튜브 채널 '얄팍한 코딩사전'. 영상에서 다 알려주지 못한 정보들이나 자주

ondolroom.tistory.com

 

https://ondolroom.tistory.com/881

 

도커 docker 간단 정리

리눅스 우분투에 도커 설치 https://shanepark.tistory.com/237 Ubuntu 20.04 LTS ) Docker 설치하기 Intro Docker는 제가 회사에서 사용하는 노트북의 OS를 Windows 에서 Ubuntu 로 변경하게 된 트리거 였습니다...

ondolroom.tistory.com

 

 

1. SpringBoot 프로젝트 준비 및 세팅

간단한 todoList를 준비하였다. 아래에서 다운로드 받을 수 있다.

springdatajpa_project.zip
0.07MB

 

프로젝트 환경

//스프링부트 버전
springboot 2.6.2
// 자바 환경
java 1.8
// 데이터베이스
h2 mem database
// 포트
8082

 

위 프로젝트를 빌드하여 jar 파일로 만들자.

파일명은 springdatajpa_project 가 앞에 붙도록 제작하는 것을 추천한다.
(ex springdatajpa_project-asdf.jar 등)

 

빌드 툴이 없다면 아래 링크를 따라하여 빌드해보자.

https://velog.io/@kekim20/Spring-Boot-%EB%B9%8C%EB%93%9C%ED%95%98%EC%97%AC-jar%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0

 

[Spring Boot] 빌드하여 jar파일 생성/실행하기

빌드하고 jar파일로 실행하기

velog.io

 

 

2. AWS EC2 세팅하기 

 

AWS는 콘솔화면이 자주 바뀐다.

20220425날짜 기준으로 작성 중이다.

 

AWS 아이디가 없다면 가입하자.

 

가입하고 인스턴스 시작을 눌러 클라우드 서버를 만들어보자.

 

이름은 없어도 되나 구분을 위해 적어주자.

 

AMI는 서버의 OS를 의미한다.

테스트 결과 도커 환경을 원활히 작동시키는 Ubuntu을 추천한다. 

 

인스턴스 유형은 서버의 성능을 정하는 부분이다.

현재 연습용이기 때문에 프리티어(AWS 신규 가입시 1년간 무료) 유형을 선택하자.

 

키페어는 보안접속을 위한 것이다.

키페어가 있다면 선택해주고, 없거나 새로만들고 싶으면 새 키 페어 생성으로 생성하자.
(생성 시 기본적으로 키페어 유형은 RSA, 여기서는 Mobax를 사용하므로 파일 형식은 pem 추천)

 

기존에 보안 그룹을 만들어 두지 않았다면 아래와 같이
SSH 트래픽허용 / HTTPS 트래픽 허용 / HTTP 트래픽 허용을 선택해주자.(22 / 443 / 80 인바운드 포트가 열린다.)
(추후 다른 포트를 사용할 경우 보안그룹에서 포트 설정을 해줘야 된다는 점을 기억하자.)

 

용량은 10기가 이상 gp3를 이용하는 것을 추천한다.
aws신규 가입자는 프리티어로 비용없이 사용가능 하기 때문에 30기가로 설정해도 무방하다.

 

 

모두 선택했다면 인스턴시작을 눌러주자.

 

모든 인스턴스 보기를 눌러 확인해보자.
(늦게 뜨는 경우가 있으니 새로고침하거나 기다려보자.)

 

퍼블릭 IPv4 주소를 확인하자.
(해당 아이피는 동적 아이피이다. 인스턴스를 중지하고 재실행하면 바뀔 수 있다. 바뀌지 않게 하려면 탄력적 IP를 사용하자.)

 

3. EC2 접속 및 도커 세팅하기

 

MobaXterm을 켜서 접속 세팅을 하자.

 

Session을 누른다.

 

SSH 클릭

Reomte host는 EC2서버의 퍼블릭 주소를 선택한다.

Specify username은 리눅스 서버의 기본유저명을 말한다.
우분투의 경우 ubuntu

포트는 22

Advanced SSH settings를 클릭하고 Use private key를 체크한다.

EC2를 구성할 때 생성한 키페어를 선택하여 넣어준다.

모두 작성했다면 OK를 눌러주자. 

 

아래와 같이 뜨면 접속에 성공한 것이다.

 

아래 링크를 참고하여 우분투에서 도커를 세팅해보자.

https://shanepark.tistory.com/237

 

Ubuntu 20.04 LTS ) Docker 설치하기

Intro Docker는 제가 회사에서 사용하는 노트북의 OS를 Windows 에서 Ubuntu 로 변경하게 된 트리거 였습니다. Docker를 사용하면 정말 편하게 격리된 컨테이너들을 구성해 가상화의 장점을 정말 잘 살릴

shanepark.tistory.com

 

 

4. 프로젝트 배포해보기

 

먼저 편안한 작업을 위해 Super User 권한을 받아오자.

 

원하는 경로에 폴더를 하나 만들어주자.

필자는 project 라고 이름 지었다.

 

해당 디렉토리로 이동해주자.

 

 

도커파일을 만들자.

확장자 없이 파일을 하나 만들고 이름을 Dockerfile 로 만든다.
(만들기 어렵다면, 예제 프로젝트 내부에 도커파일을 만들어 두었으니 사용하면된다.)

아래와 같이 내용을 입력해주자.
(1번 Jar파일 제작에서 정해준 이름에 따라 아래 ARG부분을 적절히 수정해주자. )

아래에 설명이 있으니 참고하자.

# 도커 허브에서 이미지를 가져와서 이미지를 작업한다
# FROM (이미지 이름:버전)
#FROM openjdk:8-alpine3.9
FROM openjdk:8-jre-alpine3.9

# 컨테이너 실행 전 작동할 명령
# RUN (명령)
# 타임존 설정 (설정을 하지 않으면 시간 저장시 다른 시간대로 저장됨)
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo Asia/Seoul > /etc/timezone

# 컨테이너 내 작업 경로
# WORKDIR (경로)
WORKDIR /app

# 작업 파일을 변수화 하기
# ARG (변수명)=(파일명)
ARG JAR_FILE=springdatajpa_project*.jar

# 작업 파일을 컨테이너로 복사
# COPY (파일명 또는 ${변수명}) (복사할 파일명)
COPY ${JAR_FILE} application.jar

# 컨테이너 시작 시 내릴 명령 (CMD와 ENTRYPOINT 차이 확인)
# ENTRYPOINT [(명령),(매개변수),(매개변수),(...)]
ENTRYPOINT ["java","-jar","application.jar"]

 

도커파일과 Jar 파일을 드래그하여 폴더에 넣어주자.

 

 

도커 배포 순서

1. 이미지 만들기 docker bulid ~

2. 컨테이너 만들기 docker create

3. 컨테이너 실행하기 docker start

(컨테이너 만들기와 실행하기를 동시에 할 경우 docker run을 사용한다.)

 

해당 프로젝트 디렉토리로 이동해보자.

cd /home/ubuntu/project/

 

프로젝트를 이용하여 이미지를 만들어보자.

docker build [옵션] [ -t 이미지 명] [도커파일 경로]

-t 는 이미지에 이름을 붙여준다는 뜻이다.

. 은 도커파일의 경로이다. 아까 도커파일 경로로 이동했기 때문에 . (현재경로)로 입력한다.

docker build -t test_proj_img .

 

성공적으로 만들어 졌다면, 

아래 코드로 이미지를 확인해보자.

docker images

 

컨테이너를 만들어 보자.

docker create [옵션] [-p 외부포트:내부포트] [--name 컨테이너명] [이미지명]

프로젝트는 8082포트로 제작하였지만 외부에서 80포트로 들어올 경우를 가정하여 제작한다.

docker create --restart=always -p 80:8082 --name test_proj test_proj_img

 

컨테이너가 생성되었는지 확인해보자.

-a 옵션은 모든 컨테이너를 보여준다는 뜻이다. (-a를 빼면 실행 중인 컨테이너만 보인다.)

docker ps -a

 

도커를 실행한다.

docker start test_proj

 

#참고 -  create와 start를 동시에 할 경우 run 명령어를 사용한다.

 

작동 로그를 확인한다.

-f 옵션은 컨테이너 내부에 로그를 지속적으로 보여줄 때 사용한다.

docker logs -f test_proj

로그를 벗어날 때에는 Ctrl + C 를 사용한다.

 

컨테이너 안의 리눅스 환경을 확인하려면

// 일반 이미지 기반 컨테이너
docker exec -it test_proj /bin/bash

또는

// alpine이나 slim 이미지 기반 컨테이너
docker exec -it test_proj /bin/sh

 

접속이 된 것을 확인할 수 있으며 도커파일의 WORKDIR로 시작하는 것을 볼 수 있다.

 

해당 컨테이너에서 나갈 때에는 exit를 입력한다.

 

웹에서 확인해보자.

자신의 퍼블릭 아이피로 접속해보면

 

아래와 같이 나오면 성공이다.

 

 

 

시간이 없으신 분들을 위한 선 요약 세팅

(Use this setting)

plugins {
    id 'org.springframework.boot' version '2.6.2'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
    maven { url "https://plugins.gradle.org/m2/" } // 플러그인 저장소
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // QueryDSL
    implementation "com.querydsl:querydsl-jpa:5.0.0"
    implementation "com.querydsl:querydsl-core:5.0.0"
    annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jpa"
    annotationProcessor 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final'
    annotationProcessor 'javax.annotation:javax.annotation-api:1.3.2'
}

test {
    useJUnitPlatform()
}

 

 

---------------------------------------------------

(Don't use this setting )

QueryDsl 세팅에 애를 먹는 경우가 많다 4 버전 대에는 특히 심했는데, 아래와 같은 코드를 추가해줬었다

 

여러 페이지들을 검색하며 세팅하였으나 공유하여 다른 사람이 쓰면 안되는 등 골치가 아팠다.

하지만 5버전을 세팅하면서 부터인지 위와 같은 복잡한 세팅이 필요 없어진 듯하다.

맨 위에 보이는 세팅처럼 //QueryDsl 부분만 추가해주면 따로 설정이 필요없이 잘 작동 될 것이다.

 

스프링 부트 (intellij)

HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

 

nextjs (intellij vscode)

# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# local env files
.env*.local

# vercel
.vercel

# typescript
*.tsbuildinfo

# intellij
.idea

### VS Code ###
.vscode/

 

ignore 하기 전에 잘못 올라간 파일들은 아래 링크를 참고하여 삭제할 수 있다.

https://gmlwjd9405.github.io/2018/05/17/git-delete-incorrect-files.html

 

[Git] Github에 잘못 올라간 파일 삭제하기 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

'낙서장' 카테고리의 다른 글

openssl 로컬 키 만들기  (0) 2021.08.17
라이브데이터 LiveData 장점  (0) 2021.04.02
인텔리제이 output 한글깨짐  (0) 2021.01.12
스프링부트 jar 배포하면 404에러  (0) 2021.01.12
인텔리제이 자동 빌드  (0) 2021.01.01

 

 

https://nextjs.org/docs/advanced-features/middleware

 

Advanced Features: Middleware (Beta) | Next.js

Learn how to use Middleware in Next.js to run code before a request is completed.

nextjs.org

 

 

import { NextFetchEvent, NextRequest, NextResponse } from "next/server";
import jwtDecode from "jwt-decode";
import CustomJwtPayload from "@/util/jwt/CustomJwtPayload";

// 리프레시 토큰 관리를 위한 미들웨어 제작
export function middleware(req: NextRequest, ev: NextFetchEvent) {
  // 스태틱파일 구분을 위한 정규표현식
  const PUBLIC_FILE = /\.(.*)$/;

  const { origin, pathname } = req.nextUrl;

  // 스태틱파일이 아니거나 로그인 관련 주소가 아니면 조건실행
  if (!PUBLIC_FILE.test(pathname) && !pathname.includes("/sign")) {
    console.log(req.nextUrl);

    const refreshToken = req.cookies["refresh_token"];
    const nowTimestamp = new Date().getTime();

    // 만료일 초기화
    let exp = -1;

    // 디코딩하여 만료일 체크
    try {
      exp = jwtDecode<CustomJwtPayload>(refreshToken).exp * 1000;
    } catch (e) {
      // 토큰이 디코딩 되지 않으면 로그인 페이지로 이동
      return NextResponse.redirect(`${origin}/sign/in`);
    }

    // 만료되었으면 로그인 페이지로 이동
    if (exp < nowTimestamp) {
      return NextResponse.redirect(`${origin}/sign/in`);
    }
  }
}

+ Recent posts