# 개요

톰캣을 설치해서 사용할 때는 바로 jsp 파일을 읽을 수 있었는데

내장 톰캣을 사용하니 jsp 파일을 읽을 수가 없다.

JSP를 서블릿으로 변환시켜주는 Jasper에 대해 알아보자.

 


 

# JSP에 대한 오해

JSP가 여러모로 불편하기 때문에 안써왔어서(물론 앞으로도 쓸 생각은 별로 없음..) 잘 몰랐는데, 나는 여태 JSP가 HTML처럼 그냥 화면에 보여주는 줄 알았다.

그런데 그게 아니고, JSP 파일을 컴파일 해서 PrintWriter같은 클래스를 이용해서 HTML처럼 보이게 출력해주는 것이었다.

 

## 자바로 HTML 그리기

기존에 자바로 HTML을 그릴 때 방식을 보면

import java.io.*;

public class HTMLPrinter {
    public static void main(String[] args) {
        String fileName = "output.html"; // HTML 파일명

        try {
            PrintWriter writer = new PrintWriter(new FileWriter(fileName));

            // HTML 페이지 시작
            writer.println("<!DOCTYPE html>");
            writer.println("<html>");
            writer.println("<head>");
            writer.println("<title>간단한 HTML 페이지</title>");
            writer.println("</head>");
            writer.println("<body>");
            writer.println("<h1>Hello, World!</h1>");
            writer.println("<p>This is a simple HTML page generated using Java.</p>");
            writer.println("</body>");
            writer.println("</html>");

            // 파일 닫기
            writer.close();

            System.out.println("HTML 파일이 생성되었습니다. 파일명: " + fileName);
        } catch (IOException e) {
            System.out.println("파일 생성 중 오류가 발생했습니다: " + e.getMessage());
        }
    }
}

이런 방식으로 일일이 자바 코드 내에서 HTML태그를 사용해야 했었다. 그리고  HTML태그 String에 자바에서 사용하는 변수나 객체를 추가하는 방식으로 사용했다.

하지만 이런 방식은 매우 번거롭고 불편하다.

 

## HTML to JSP

정적 페이지인 HTML에 자바 데이터를 동적으로 사용하기 위해 JSP가 만들어졌다. 사용 방법도 html 확장자를 jsp로 바꿔 주고 스크립트릿만 추가해주면 된다.

그러나 JSP는 자바코드에 의한 동적인 페이지가 되었기 때문에 이를 컴파일을 해주어야 한다.

 


 

# Jasper

Jasper는 JSP파일을 서블릿 코드로 변환하고 컴파일 하여 HTML 파일처럼 실행하는 톰캣의 JSP 엔진이다.

JSP파일이 그냥 화면에 HTML처럼 보여지는 것이 아니라 톰캣의 Jasper를 통해 서블릿 코드로 변환하고 이를 HTML로 그려주는 것이다.

 


 

# 결론

톰캣을 설치하면 Jasper가 같이 설치되어 있기 때문에 별 신경쓰지 않고 바로 JSP를 읽을 수 있지만, Embedded Tomcat의 경우는 그렇지 않기 때문에 라이브러리를 따로 추가해야 한다.

 


 

# Reference

 

JSP를 서블릿으로 변환시켜주는 Jasper

JSP(Java Server Pages)는 HTML에 Java코드를 편리하게 적을 수 있도록 도와줍니다. 그런데 HTML에 Java코드를 적다 보니 많은 분들께서 오해하는 것이 있습니다. 바로 브라우저의 화면에 띄워지는 것이 JSP

thisisnew-storage.tistory.com

 

# 개요

학원 다니면서 개인 프로젝트로 플래너 개발을 해보기로 했다.

처음에는 학원에서 배운 내용 + 내가 알고 있었는데 잊었던 것들 + 이번 개인 프로젝트로 새로 배우고 싶었던 것들 세 가지를 적절히 섞어 구현할 예정이다.

기존 직접 구현한 웹 서버를 Tomcat을 추가하고 Servlet을 추가했다.

 


 

# Embedded Tomcat 추가

책을 참고하며 Embedded Tomcat 라이브러리를 추가하고 직접 구현한 WebServer를 Tomcat Server를 실행하는 것으로 대체 했다.

Tomcat에 추가하는 Context는 주로 웹 어플리케이션의 설정과 속성을 정의하는데 사용한다.

addContext()로 브라우저를 통해 "localhost:8080/"로 요청을 보내면 WEB_APP_DIR_LOCATION 디렉토리에 있는 html 파일에 접근할 수 있도록 설정했다.

WebResourceRoot를 이용하여 Gradle 빌드 시 생성되는 클래스 파일 경로인 build/classes를 읽도록 설정했다.

 

Use Tomcat instead of WebServer · JinHoooooou/MiniTimer@4e3b3f1

JinHoooooou committed Feb 14, 2024

github.com

 


 

# Servlet 추가

Plan에 대한 create 기능 Servlet을 추가했다.

Create

 

add Servlet · JinHoooooou/MiniTimer@e424d2e

JinHoooooou committed Feb 14, 2024

github.com

 

 

 


 

# Chat GPT 질문

Embedded Tomcat을 사용하는 과정에서 계속 오류가 발생했는데 누군가에게 질문하기 애매한 내용이었다. 계속 구글링 해 봐도 내가 원하는 답이 나오지 않아서 고민하다가 Chat GPT를 이용해 봤는데 굉장히 잘 알려줘서 깜짝 놀랐다.

좀 이상하게 알려주는 경우도 가끔 있긴 한데.. 질문 내용을 조금 수정해서 다시 물어보거나 하면 잘 알려주는 것 같다.  

https://chat.openai.com/share/648da557-d0fa-4025-a88b-6d7c366e330a

위 링크는 내가 질문 하면서 해결 한 후에 해결한 내용을 기반으로 다시 질문한 내용이다. 실제로 질문할때는 더 많이 물어보고 삽질도 많이 했다

 


 

# 간단 회고

이 작업을 할 때 쯤부터 블로그에 개발 일지를 작성하기 시작했는데, 그 때 작성한 일지 보면 회고에 커밋 메시지 관련 얘기가 많이 있다. 그 때와 비교해보면 지금은 그래도 커밋 단위가 좀 작게 쪼개져 있긴하다. 그리고 한글도 그냥 사용하기로 했다 ㅋㅋ..

Embedded Tomcat 사용하려고 할 때 삽질을 엄청 많이하기도 했고, 예제 코드, 블로그, 책 등을 참고했었는데.. 문득 그냥 Spring boot 쓸까? 라는 생각을 많이 했다. 사실 Jdbc사용할 때도 메서드마다 SQL 작성하는점, 필드 추가/삭제에 유연하지 못한 점 때문에 그냥 JPA 쓸까? 라고 생각했었다.

그럼에도 불구하고 low level부터 이해하자라는 생각을 가지고 계속 삽질했다. 거기에 동반해야할 점은 코드 라인들이 무슨 일을 하는지 이해하는게 중요하다고 생각했다. Embedded Tomcat에 Context 추가하고 Class 디렉토리 설정하는 작업들은 처음에 그냥 예제 코드 복붙해서 사용했는데, 이해를 확실하게 하고 가기 위해 Chat GPT에게 이것 저것 계속 물어봤고 지금은 이해가 된다!

# 개요

학원 다니면서 개인 프로젝트로 플래너 개발을 해보기로 했다.

처음에는 학원에서 배운 내용 + 내가 알고 있었는데 잊었던 것들 + 이번 개인 프로젝트로 새로 배우고 싶었던 것들 세 가지를 공부할겸 적용하려고 했는데

과제로 개인 미니 프로젝트를 개발 해 보라고 해서 그냥 플래너 어플 개발하던 것을 과제로 써먹기로 했다.

발표할 내용 정리와 데이터베이스가 설치된 EC2에 배포까지 해봤다. 

 


 

# ERD

Plan 단 한개만 사용했다 ㅋㅋ..

 


 

# Class Diagram

 학원에서 배운 범위는 콘솔로 View 출력하는 것이었는데 HTML로 출력하도록 했다.

 


 

# Skills

배운 범위는 Jdbc(그 마저도 Oracle Jdbc...)까지였는데 뭐 이것 저것 라이브러리도 사용해보고, 빌드 도구도 Gradle를 이용했다.

 


 

# 배포

데이터베이스를 위한 EC2 인스턴스에 프로젝트를 받아서 임시 배포를 해봤다. 사실 배포라고 하기도 민망한게 그냥 클라우드 서버인 EC2에서 jar파일 실행 시키고 다른 로컬에서 ec2 hostname:8080 접속한 것을 보여주기만 했다 ㅋㅋ...

배포(?) 과정

 

[AWS] EC2에 자바 웹 서버 실행

# 개요 EC2에 자바로 구현한 웹 서버를 실행 하고 외부에서 접속이 가능한지 확인해봤다 그 과정에서 git, jdk 설치, gradle build, jar파일 실행한 내용 정리 EC2 생성 참고 [AWS] EC2 프리티어 사용 일지 #

jino-dev-diary.tistory.com

 


 

# 간단 회고

간단히 발표하는 거긴 했는데 발표 준비를 너무 안했다 ㅋㅋ..

웹서버 동작 방식 설명하려고 이미지도 따로 준비했었는데 발표하면서 말하는 걸 까먹었다.

그리고 남들은 view 처리를 콘솔로 했는데 나만 웹으로 했다고 '아 나 좀 치는데?' 같은 오만한 생각을 좀 했다. 사실 나중가면 다 배우고 알게 될 내용인데 전공자가 그거 조금 더 안다고 우쭐해 하는 마음가짐... 옳지 않다 

# 개요

EC2에 자바로 구현한 웹 서버를 실행 하고 외부에서 접속이 가능한지 확인해봤다

그 과정에서 git, jdk 설치, gradle build, jar파일 실행한 내용 정리

EC2 생성 참고

 

[AWS] EC2 프리티어 사용 일지

# 개요 학원에서 JDBC를 이용하여 데이터베이스 연동하는 법을 배웠다. 개인 프로젝트에 데이터베이스를 연동하는 과정에서 문제가 발생했다. 학원 로컬에는 데이터베이스(Oracle)이 설치되어 있

jino-dev-diary.tistory.com

 


 

# EC2 보안 그룹 인바운드에 포트번호 추가

구현한 WebServer 코드에 포트번호를 8080으로 설정했기 때문에 8080으로 추가

 


 

# EC2에 git 설치

sudo dnf update

sudo dnf search git

sudo dnf install git -y

git --version으로 설치 확인

 


 

# EC2에 JDK 17 설치

sudo dnf search java-17

sudo dnf install java-17-amazon-corretto -y

java -version으로 설치 확인

 


 

# 프로젝트 clone

git clone {github remote repo url}

 


 

# gradle build

권한 없을 경우: chmod 700 gradlew로 실행 권한 부여

빌드 시 무한 지연이 발생할 경우에  ec2 gradle build 지연 키워드로 검색

./gradlew build

 


 

# jar파일 실행

build/libs/{프로젝트}.jar 파일 확인

java -jar build/libs/{프로젝트}.jar

오류나 Exception이 발생한다면 코드 문제일 가능성이 높음

백그라운드로 실행하여 계속 실행하고 싶다면 관련 키워드로 검색 (나는 단순 확인용..)

 


 

# 브라우저로 접속하여 확인

 


 

# Reference

ec2 인스턴스에 git 설치

 

How to Install Git on Amazon Linux 2023 Instance - CloudKatha

How to Install Git on Amazon Linux 2023 Instance. We learnt that Git is available on the core repository and very straightforward to install

cloudkatha.com

ec2 인스턴스에 java 설치

 

Amazon Corretto 17 Installation Instructions for Amazon Linux 2 and Amazon Linux 2023 - Amazon Corretto 17

Amazon Corretto 17 Installation Instructions for Amazon Linux 2 and Amazon Linux 2023 This topic describes how to install and uninstall Amazon Corretto 17 on a host or container running the Amazon Linux 2 or Amazon Linux 2023 operating systems. Install usi

docs.aws.amazon.com

 

'DevOps' 카테고리의 다른 글

[AWS] EC2에 DB설치  (0) 2024.02.17
[AWS] EC2 프리티어 사용 일지  (1) 2024.02.17

# 개요

학원 다니면서 개인 프로젝트로 플래너 개발을 해보기로 했다.

처음에는 타이머로 시작했다가 내가 생각했던 방향이 아닌거 같아서 플래너로 바꿨다.

처음에 타이머로 생각한 이유는 단순히 뽀모도로 타이머(https://chromewebstore.google.com/detail/focus-to-do-%EB%BD%80%EB%AA%A8%EB%8F%84%EB%A1%9C-%ED%83%80%EC%9D%B4%EB%A8%B8-+-%EC%97%85%EB%AC%B4/ngceodoilcgpmkijopinlkmohnfifjfb?pli=1)를 개발하려고 했기 때문인데.. 코드 작성하다보니 타이머가 돌아가는 로직은 프론트에서 간단하게 처리 할 수 있다고 생각했기 때문이다.

원래는 프로젝트 개발진행하면서 블로그도 같이 쓰려고했는데, 개발 중간에서야 작성하게 됐다 ㅎㅎ;

콘솔창에 View를 출력하는 것에서 Web에 출력하는 것으로 변환하는 과정

 


 

# WebServer 구현

책을 참고하며 WebServer를 구현했다. 로그 출력을 System.out.println()등으로 하는 것보다 Log 라이브러리를 사용하는 것이 더 좋다고 해서 Log 라이브러리도 추가하여 사용했다.  

WebServer가 클라이언트 접속을 기다리다가 연결이 되면 Thread를 상속받은 RequestHandler가 실행되는데, RequestHandler는 클라이언트에서 보낸 요청을 받고 요청에 맞는 응답을 보내는 역할을 한다.

RequestHandler에서 요청을 받는 부분은 HttpRequest가 담당하고 응답을 보내는 부분은 HttpResponse가 담당한다.

HttpRequest는 클라이언트가 보낸 요청을 처리하는데, 요청의 첫 라인인 request line을 RequestLine통해 method(GET, POST 등..), path, parameter를 추출하고 header와 request body를 key-value로 추출한다.

HttpResponse는 html을 구성하여 클라이언트로 응답을 보낸다.

 

temp commit · JinHoooooou/MiniTimer@b18b1a2

JinHoooooou committed Feb 8, 2024

github.com

 


 

# Path 추가에 따른 Controller와 RequestMapping 추가

각 기능이 추가 될 때마다 Path들도 추가가 되는데 그에 따라 RequestHandler에서 Path를 확인하는 if 조건문이 늘어난다. 그래서 Controller 인터페이스를 추가하고 각 기능들은 Controller를 구현하는 클래스들을 만들어 주었다. 그리고 그 기능들의 Path 매핑을 RequestMapping에 추가했다.

기존에 각 Path에 대한 Html 파일을 작성하는 부분도 HttpResponse에 작성했는데, 각 기능 Controller 클래스에 작성하는 것으로 변경했다.

 

Modify to Web and project restructure · JinHoooooou/MiniTimer@3d53313

JinHoooooou committed Feb 10, 2024

github.com

각 Controller마다 공통된 부분이 있어 AbstractController에 공통 기능을 추가했다.

 

Refactor: Use AbstractController · JinHoooooou/MiniTimer@da223f5

JinHoooooou committed Feb 12, 2024

github.com

Web으로 변환했으므로 기존 Console에 출력하던 View들은 전부 삭제했다.

 

erase command line view · JinHoooooou/MiniTimer@12b6616

JinHoooooou committed Feb 12, 2024

github.com

 


 

# 간단 회고

Modify to Web and project structure 커밋을 Modify console view to web view / Modify project structure 두 부분으로 나눴어야 했다. 지금 한참 지난 커밋을 보는 것인데... 엄청 헷갈린다... 매번 작성글 회고에서 커밋 단위가 큰 것을 체감하고 있다 ㅜㅜ

Web view로 변환하고 나니까 삭제한 console view 관련 코드들이 아깝게 느껴졌다. 특히 테스트코드 작성한게 엄청 아까웠는데 화면 구성같은 코드들은 테스트 코드를 작성하는 것보다 직접 확인하는게 낫겠다는 생각이 들었다.

# 개요

학원 다니면서 개인 프로젝트로 플래너 개발을 해보기로 했다.

처음에는 타이머로 시작했다가 내가 생각했던 방향이 아닌거 같아서 플래너로 바꿨다.

처음에 타이머로 생각한 이유는 단순히 뽀모도로 타이머(https://chromewebstore.google.com/detail/focus-to-do-%EB%BD%80%EB%AA%A8%EB%8F%84%EB%A1%9C-%ED%83%80%EC%9D%B4%EB%A8%B8-+-%EC%97%85%EB%AC%B4/ngceodoilcgpmkijopinlkmohnfifjfb?pli=1)를 개발하려고 했기 때문인데.. 코드 작성하다보니 타이머가 돌아가는 로직은 프론트에서 간단하게 처리 할 수 있다고 생각했기 때문이다.

원래는 프로젝트 개발진행하면서 블로그도 같이 쓰려고했는데, 개발 중간에서야 작성하게 됐다 ㅎㅎ;

데이터베이스(Mysql)을 추가하고 프로젝트와 연결하는 과정

 


 

# EC2에 데이터 베이스(Mysql) 설치

데이터베이스는 학원에서 오라클을 배웠지만, Mysql을 사용하기로 했다. Mysql을 선택한 이유는

  • 내 로컬(노트북)에는 데이터베이스 프로그램이 설치되어 있지 않은데 굳이 설치하고 싶지 않았다. 그렇다면 어떤 원격의 데이터베이스를 이용해야 한다.
    1. 학원 컴퓨터를 항상 켜 놓은 상태로 두고 원격 데스크톱 연결을 통해 노트북에서 학원 컴퓨터로 접속해서 개발을 진행 → 학원 공유기를 포트 포워딩 해야하는데 공유기 비밀번호를 모르기 때문에... 패스
    2. 내장 데이터베이스인 H2를 사용 → 기왕 사용하는거 데이터베이스 설치해서 사용하자라는 생각으로.. 패스
    3. 옛날에 AWS를 사용해봤으니까 복습한다는 생각으로 EC2 인스턴스에 데이터베이스를 설치하여 사용하는 것으로 결정!
  • 오라클을 설치하는 과정이 꽤나 복잡해서 Mysql을 선택했다. (근데 Mysql도 생각보다 복잡하더라..)
    • RDS라는 서비스도 있긴 했는데 사용해본적이 없어서 우선 EC2에 설치해서 사용해보다가 RDS도 사용 해보기로..

EC2에 Mysql 설치하는 과정

 

[AWS] EC2에 DB설치

# 개요 생성한 EC2에 Database(Mysql)을 설치해보자 학원에서는 Oracle을 사용하긴 했는데, 찾아보니 Linux에 Oracle설치하는게 꽤 복잡해서 그냥 Mysql로 진행하기로 했다. 근데 AWS RDS라는 데이터베이스 서

jino-dev-diary.tistory.com

 


 

# 내 프로젝트와 연결, CRUD 기능 구현

Mysql jdbc인 Mysql Connector를 통해 EC2에 설치된 Mysql과 연결했다.

그 과정에서 기존에 Controller의 List에 저장했던 Plan 객체들을 Database에 저장하도록 수정했다.

CRUD 기능에 대한 메서드를 구현했는데 Connection을 생성하는 부분이 중복되어서 JdbcTemplate에 데이터베이스와 연결하는 코드를 분리하여 작성하였다.

Connection 이후 PreparedStatement를 이용해서 Query에 객체 필드들을 매핑해주고 executeUpdate()(CUD) / executeQuery() (R)을 통해 쿼리를 실행했다.

이후 필요에 따라 데이터베이스 row를 자바 Object로 매핑 후 반환했다.

 

Add Feature: connect to Mysql Database · JinHoooooou/MiniTimer@8f53d07

JinHoooooou committed Feb 7, 2024

github.com

 


 

# 간단 회고

저 커밋 하나에 내용이 너무 많아서 여전히 읽기 힘들다 ㅜㅜ 커밋 작게하는 습관을 들여야하는데 생각보다 쉽지않다

database 연결할 때 접속 계정과 패스워드가 필요한데, Github에 올릴 때는 그걸 빼고 올려야 하는데 같이 올려버렸다... 이번 경우에는 EC2 인스턴스를 중지 후 재시작 함으로써 hostname이 변경 되었기 때문에 크게 상관 없겠지만 이런 정보는 별도의 파일로 만들어서 .gitignore에 해당 파일을 추가하거나 환경 변수로 구성하는 방법으로 보완해야겠다는 생각이 들었다.

# 개요

생성한 EC2에 Database(Mysql)을 설치해보자

학원에서는 Oracle을 사용하긴 했는데, 찾아보니 Linux에 Oracle설치하는게 꽤 복잡해서 그냥 Mysql로 진행하기로 했다.

근데 AWS RDS라는 데이터베이스 서비스도 있더라. 이것도 나중에 사용해보자. 지금은 관련 내용은 작성하지 않겠다.

 


# EC2 접속

참고하자.

 

[AWS] EC2 프리티어 사용 후기

# 개요 학원에서 JDBC를 이용하여 데이터베이스 연동하는 법을 배웠다. 개인 프로젝트에 데이터베이스를 연동하는 과정에서 문제가 발생했다. 학원 로컬에는 데이터베이스(Oracle)이 설치되어 있

jino-dev-diary.tistory.com

 


# Mysql 설치

dnf search mysql

sudo dnf update

sudo wget https://dev.mysql.com/get/mysql80-community-release-el9-4.noarch.rpm

sudo dnf install mysql80-community-release-el9-4.noarch.rpm

sudo dnf install mysql-community-server

너무 길어서 생략..

설치 확인 (mysql -V)

 


# Mysql 실행

sudo systemctl start mysqld

sudo systemctl enable mysqld

systemctl status mysqld

 

# Mysql 계정 생성 및 권한 부여

sudo grep temporary password /var/log/mysqld.log

비밀번호로 root 계정 접속

mysql -u root -p

임시 비밀번호 변경

alter user 'user'@'localhost' identified by '{바꿀 비밀번호}';

사용자 계정 생성

create user '{계정명}'@'%' identified by '{비밀번호}';

생성한 사용자 계정에 권한 부여

grant all privileges on *.* to {계정명}@'%';

 


# Mysql 사용

사용자 계정으로 접속

mysql -u '{계정명}' -p

 

스키마(데이터베이스)생성 및 사용

create database {데이터베이스_이름} / use {데이터베이스_이름}

 


# Reference

https://cloudkatha.com/how-to-install-mysql-8-on-amazon-linux-2023/

 

How to Install MySQL 8 on Amazon Linux 2023 - CloudKatha

guide, we talked about How to Install MySQL 8 on Amazon Linux 2023 Instance. We saw that MySQL 8 is not available in the core repository of

cloudkatha.com

https://velog.io/@ejayjeon/MYSQL-1.-계정-생성-권한-부여

 

[MYSQL] 1. 계정 생성 / 권한 부여

<small style="color: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER

velog.io

 

'DevOps' 카테고리의 다른 글

[AWS] EC2에 자바 웹 서버 실행  (1) 2024.02.24
[AWS] EC2 프리티어 사용 일지  (1) 2024.02.17

# 개요

학원에서 JDBC를 이용하여 데이터베이스 연동하는 법을 배웠다.

개인 프로젝트에 데이터베이스를 연동하는 과정에서 문제가 발생했다.

학원 로컬에는 데이터베이스(Oracle)이 설치되어 있어서 문제없이 개발진행이 되는데, 내 개인 로컬에는 데이터베이스가 설치되어 있지 않다.

물론 설치하면 되긴한데.. 생각해보면 데이터베이스를 그렇게 자주 다루지도 않을거고 로컬에 설치해봤자 쿼리 연습용으로만 쓸 것 같은데 그걸 위해 설치하는 것은 뭔가 용량이 아깝게 느껴졌다 ㅋㅋ;;

처음에는 원격 데스크톱 연결을 통해 학원 로컬의 데이터베이스와 연결하면 되겠다 생각했었는데, 그러기 위해선 공유기 포트포워딩을 해야한다. 근데 공유기 admin 계정을 몰라서 할 수가 없었다.

다른 방법 없을까 생각하던중에 AWS EC2가 생각나서 공부도 할겸 사용해보기로 했다. 간단하게 사용할 예정이라 프리티어로도 충분히 커버 가능할것으로 판단했다.

 


# AWS 계정 생성

계정 생성 과정은 링크로 대체한다. 추가로 2단계 인증 설정만 좀 귀찮을 뿐이지 어려운 부분이 없어서 링크에 나온대로 따라하면 다 된다.

https://docs.aws.amazon.com/ko_kr/signin/latest/userguide/how-to-sign-in.html

 

AWS에 로그인하는 방법 - AWS 로그인

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 


# EC2

EC2 (Elastic Compute Cloud): 아마존 웹 서비스 (AWS)제공하는 클라우드 서비스. 프리티어 사용가능하다.

AWS Console → EC2 

EC2 Free Tier 사용량이 초과하지 않는 한에서 12개월간 무료로 사용할 수 있다. 12개월 이후로는 사용하지 않아도 기본 요금(대충 1달러정도 였던거 같음)이 부과되니 프리티어 기간이 지나면 꼭 계정 삭제할 수 있도록 하자..

인스턴스가 각 컴퓨터라고 생각하면 되고, 인스턴스를 생성하기 전에 보안 그룹과 키 페어를 생성할 것이다.

 


키 페어 생성

키 페어 메뉴로 가면 첫 짤처럼 키 페어를 생성 할 수있는 버튼이 있다. 눌러보면 두번째 짤처럼 이름 작성하는 것과 파일 형식이 보이는데, 우리는 OpenSSH를 이용할 것이기 때문에 .pem 형식의 파일을 생성할 것이다. 키 페어 생성하면 최초로 .pem형식이 파일이 설치되는데 한번만 설치되므로 잘 간직하도록 하자

잘 생성됐다.

 


보안 그룹 생성

EC2 대시보드에 있는 보안 그룹 메뉴를 통해 보안 그룹으로 이동 할 수있다. 이름, 설명을 대충 작성하고 인바운드 그룹에 추가할 것들이 있다.

HTTP/HTTPS는 Anywhere IPv4로 설정하고, 우리는 Mysql 데이터베이스를 사용할 것이기 때문에 MYSQL/Aurora도 등록한다. 그리고  SSH는 되도록 내IP만 사용하도록한다.

 


인스턴스 시작

이제 EC2 인스턴스를 생성한다. EC2 대시보드에 보면 인스턴스 시작 버튼이 있다. 종류가 많은데, 우리는 프리티어를 이용할것이다. Amazon Linux 2023을 선택하자. 인스턴스 유형은 t1.micro를 선택한다. 어짜피 얘만 프리티어로 사용가능하다.

밑으로 내리다 보면 키 페어 선택하는 창이 있는데 앞에서 생성한 키 페어로 설정하자.

그 아래에 네트워크 설정이 있는데 우측 상단의 편집 버튼을 눌러 설정한다.

그리고 인스턴스 시작 버튼을 누르면 새 인스턴스가 생성된다.

 


# SSH로 접속하기

위 인스턴스 목록 짤에서 생성한 인스턴스를 눌러보면 퍼블릭 IPv4 주소나 DNS가 보일것이다. 둘 중 하나를 복사한다.

터미널을 실행하고 .pem 파일이 있는 위치로 이동한다. 나는 git bash를 이용했다. 그리고 다음과 같이 입력한다.

ssh -i {생성한_키페어}.pem ec2-user@{퍼블릭 IPv4주소}

!주의: 나는 설명서 봤을 때 {name}@{public_IPV4}로 접속하라고 해서 내가 인스턴스 생성할 때 작성한 이름인 줄 알았는데 그게 아니었다. 설명서 보면 인스턴스 종류마다 기본 사용자 이름이 있는데 Amazon Linux 2023은 ec2-user이었다. 이거 때문에 접속이 안돼서... 시발! 주의하자!

그럼 접속 확인을 묻는데 yes 입력하고 enter치면 접속된다

 


# Reference

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html

 

Amazon EC2 사용 설정 - Amazon Elastic Compute Cloud

보안상의 이유로 SSH 규칙이 포함된 CidrIp에 0.0.0.0/0을 지정하지 마세요. 이렇게 하면 인터넷의 모든 IP 주소에서 인스턴스에 액세스할 수 있습니다. 테스트 환경에서 잠시 사용하는 것은 괜찮지

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/EC2_GetStarted.html

 

자습서: Amazon EC2 Linux 인스턴스 시작 - Amazon Elastic Compute Cloud

키 페어 없이 진행(권장하지 않음)(Proceed without a key pair (Not recommended))을 선택하지 마세요. 키 페어 없이 인스턴스를 시작하면 인스턴스에 연결할 수 없습니다.

docs.aws.amazon.com

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/connect-to-linux-instance.html

 

Linux 인스턴스에 연결합니다 - Amazon Elastic Compute Cloud

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

'DevOps' 카테고리의 다른 글

[AWS] EC2에 자바 웹 서버 실행  (1) 2024.02.24
[AWS] EC2에 DB설치  (0) 2024.02.17

# 개요

항상 Gradle을 쓸 때 IDE를 이용해서 빌드 및 실행을 했었는데 CMD로는 어떻게 할까?

그리고 IDE에서는 실행 할 때 알아서 빌드까지 진행해 주었는데 구분 동작은 어떻게 되는지 알아보자.

Gradle에 대한 세세한 정보는 여기서 다루지 않는다. 단순히 Gradle로 빌드하고 실행하는 것만 다룬다.

 


# Gradle Project Structure

  • settings.gradle: 프로젝트의 구성을 정의하는 설정 파일
  • build.gradle: 프로젝트 빌드 스크립트가 포함된 파일, Groovy나 Kotlin DSL을 사용
  • src/main: 메인 소스 코드 및 리소스가 있는 디렉토리
  • src/test: 테스트 소스 코드 및 리소스가 있는 디렉토리
  • build/: 필드 프로세스에서 생성되는 출력파일이 있는 디렉토리. 컴파일 된 class파일 빌드된 jar파일

  


# Gradle Wrapper

원래는 Gradle 빌드를 하려면 Gradle 설치를 따로 해야한다고 한다. 근데 옛날에 스프링부트로 개발할 때는 설치 없이도 잘 됐는데??

알고보니 Gradle Wrapper라는 것이 있다고 한다.

Gradle Wrapper는 미리 지정된 버전의 Gradle을 호출하도록 하는 스크립트다. Gradle 빌드를 사용하기 위해서는 알맞은 버전이 설치되어 있는데 매번 버전 업데이트를 하는 것이 비효율적이기 때문에 Gradle에서 프로젝트 생성시 내장 Gradle를 넣어주도록 했다.

Gradle 프로젝트 생성하면 기본적으로 생성되어 있는 gradlew이나 gradlew.bat 파일을 이용한다.

  • gradle-wrapper.properties: gradle wrapper 설정 파일. gradle 버전 및 다운로드 링크 기록
  • gradle-wrapper.jar: gradle wrapper 실행에 필요한 jar파일. gradle 래퍼 스크립트인 gradlew파일이 gradle을 다운로드하고 실행하는데 사용
  • gradlew/gradlew.bat: Unix / Windows 시스템에서의 Gradle Wrapper 스크립트. 프로젝트를 빌드하고 관리하는데 필요한 Gradle 실행 파일을 다운로드하고 실행

 


# Gradle 명령어를 이용하여 빌드

cmd로 빌드할 때는 gradlew / gardlew.bat 파일이 있는 root directory로 이동

gradle clean

IDE(IntelliJ)

CMD

 


gradle build

IDE(IntelliJ)

CMD

 


# .jar파일 실행

CMD에서 java -jar {projectName}.jar 파일을 실행하기 위해서는 build.gradle 파일에 다음과 같이 작성해야한다.

jar {
    manifest {
        attributes 'Main-Class': 'com.kh.Main'
    }
    from {
        configurations.runtimeClasspath.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
  • manifest 부분: JAR파일 내의 manifest 파일에 대한 속성을 지정, 버전, 주요 클래스, 클래스 경로 등의 정보가 포함됨
  • from 부분: Dependency가 필요할 때 추가함
  • DuplicateStrategey 부분: 중복 파일이 발견되면 하나만 JAR에 포함하고 나머지는 제외 

gradle 빌드 이후에 다음 명령어를 통해 Jar파일을 실행한다.

java -jar {jar파일_경로}

 


# Reference

Gradle 빌드 관련

https://jammdev.tistory.com/210

 

[Gradle] Gradle 사용법 - 설치, 초기화 및

지난 글에서는 Gradle 이 무엇인지 알아보았다. 이번에는 Gradle 을 설치하고 사용해보는 튜토리얼을 진행해보려 한다. 해당 내용은 Gradle 의 Getting Started 내용을 읽고 작성하였다. 1. Gradle 설치 & Gradl

jammdev.tistory.com

Chat GPT

https://chat.openai.com/share/0a93ceee-548e-4da2-81cd-93a2b612486e

 

Jar 배포 관련

https://www.inflearn.com/questions/923059/%EC%95%B1-%EB%B0%B0%ED%8F%AC%EC%8B%9C-jar-%EC%A7%88%EB%AC%B8

 

앱 배포시 jar 질문 - 인프런

앱을 배포하는 도중 계속 에러가 나 질문 올립니다.plugins { id 'java' id 'org.springframework.boot' version '3.0.4' id 'io.spring.dependency-management' version '1.1.0'...

www.inflearn.com

https://ink1234.tistory.com/12

 

[Gradle] dependency 가 포함된 jar 만들기

프로젝트에 Dependency를 추가 할때 Gradle의 dependencies를 사용해서 외부에서 라이브러리들 다운로드해서 임포트를 하는 경우가 있습니다. 12345678910dependencies { compile group: 'org.apache.httpcomponents', name: 'h

ink1234.tistory.com

https://stackoverflow.com/questions/21721119/creating-runnable-jar-with-gradle

 

Creating runnable JAR with Gradle

Until now I created runnable JAR files via the Eclipse "Export..." functionallity but now I switched to IntelliJ IDEA and Gradle for build automation. Some articles here suggest the "application" ...

stackoverflow.com

 

# 개요

학원 다니면서 개인 프로젝트로 플래너 개발을 해보기로 했다.

처음에는 타이머로 시작했다가 내가 생각했던 방향이 아닌거 같아서 플래너로 바꿨다.

처음에 타이머로 생각한 이유는 단순히 뽀모도로 타이머(https://chromewebstore.google.com/detail/focus-to-do-%EB%BD%80%EB%AA%A8%EB%8F%84%EB%A1%9C-%ED%83%80%EC%9D%B4%EB%A8%B8-+-%EC%97%85%EB%AC%B4/ngceodoilcgpmkijopinlkmohnfifjfb?pli=1)를 개발하려고 했기 때문인데.. 코드 작성하다보니 타이머가 돌아가는 로직은 프론트에서 간단하게 처리 할 수 있다고 생각했기 때문이다.

원래는 프로젝트 개발진행하면서 블로그도 같이 쓰려고했는데, 개발 중간에서야 작성하게 됐다 ㅎㅎ;

 


# Gradle 빌드 툴 사용

학원에서 현재까지 진행된 프로젝트를 각자 발표한다고 했다. 발표하는 것은 문제가 아닌데, 개발 환경이 달라서 조금 문제가 됐다. 내 로컬 개발 IDE는 IntelliJ (Community)인데, 학원에서 진행하는 IDE는 Eclipse를 사용했다. 내 기억으로는 IntelliJ에서 생성한 프로젝트랑 Eclipse랑 호환이 안돼서 추가적인 세팅이 필요한 것으로 알고있다.

그래서 구글링하면서 세팅을 만져봤는데.. 내가 잘 못 한건지 계속 안되더라 ㅜㅜ 그래서 그냥 IntelliJ에서 작성한 코드들 다 복사해서 Eclipse에 새로 프로젝트 생성해서 붙여넣기 할까 생각했었는데, Git 설정도 문제가 될 것 같아서 그 방법은 관뒀다. Eclipse와 내 Remote Git을 연결해서 clone할까 생각도 했는데 그것도 내가 잘 못해서 그러는지 계속 안되더라 ㅜㅜ

그래서 "빌드 툴인 Gradle을 사용해서 jar파일로 만들고 발표할 로컬에서 Gradle을 이용해서 실행하면 되지 않을까?" 라는 생각으로 Gradle을 사용해보았다.

간단히 build.gradle파일과 settings.gradle파일 추가하면 IntelliJ가 자동으로 인식해서 Gradle Project Load할거냐고 물어본다. (역시 갓텔리제이... 똥클립스..) 

https://github.com/JinHoooooou/MiniTimer/commit/855a1daa1fa7fb098133687ff4c05e62f0008e45

 

Gradle 빌드 툴 사용관련 글

 

[Gradle] Gradle 빌드, 실행하기

# 개요 항상 Gradle을 쓸 때 IDE를 이용해서 빌드 및 실행을 했었는데 CMD로는 어떻게 할까? 그리고 IDE에서는 실행 할 때 알아서 빌드까지 진행해 주었는데 구분 동작은 어떻게 되는지 알아보자. Gradl

jino-dev-diary.tistory.com


# 자바 Linter와 Code Style 적용

학원 로컬과 노트북 설정이 달라서 그런가 계속 자동 정렬할 때마다 Git Change 요소가 발생해서 이 참에 Code Style을 적용해보기로 했다.

다른 블로그들 보면 네이버 캠퍼스 핵데이 코딩 컨벤션을 많이 맞췄던데.. 혼자하는 프로젝트기도 하고 Google Code Style이 더 범용적(?)으로 사용할테니 Google Code Style을 적용했다.

https://jino-dev-diary.tistory.com/entry/IntelliJ-LinterCheckStyle%EC%99%80-FormatterCode-Style-%EC%A0%81%EC%9A%A9

 

[IntelliJ] Linter(CheckStyle)와 Formatter(Code Style) 적용

개요 코드 스타일 통일을 위해 IntelliJ에 Linter와 Formatter를 적용해보았다 옛날에 파이썬 쓸 때, black, flake8같은 도구들이 매우 좋았는데 자바에는 없나 싶어서 찾아보니 있었다! CheckStyle 설치 Intelli

jino-dev-diary.tistory.com

 


# Conver Timer into Planner

CRUD까지 추가하고 든 생각이 Timer 자체는 View에서 처리하는 작업인데, 객체로 구현할 필요가 있을까? 라는 점이었다. 구글링을 해서 여느 플래너 어플리케이션을 봐도 서버쪽에서 Timer를 처리하지는 않았다.

그래서 Timer 객체를 Plan 객체로 수정하고 들어갈 필드들을 다시 생각해보았다. 예시 어플리케이션으로 선택한 뽀모도로 타이머를 보니 제목, 뽀모도로 수, 마감일, 프로젝트, 미리알림, 반복, 하위작업, 노트가 있었다.

여기서 하위 작업을 추가하는 건 뭔가 어려워 보이고.. 당장 쉽게 구현할 수 있는 것은 제목, 뽀모도로 수, 노트, 완료 여부 정도라고 생각하여 Timer → Plan 객체로 수정하고 hour, minute, second 필드를 삭제하고 timerCount와 clear라는 필드를 추가했다.

https://github.com/JinHoooooou/MiniTimer/commit/4ce3ffbf113a911bdef0ae360442d98f09e333d1

 


# 간단 회고

이 지점의 커밋들을 보니 학원에서 작업하다가 집에서 이어서 작성하려고 완전한 상태가 아닌데도 커밋하고 푸시한 커밋들이 있었다. 혼자 작업하다보니 이런 커밋들이 구별도 가고 크게 상관없겠지만, 협업하는 경우는 어떻게 해야하는지 궁금해졌다.

회사에서 작업하다가 완전하지 않은 상태인데 나머지는 집가서 마저 작업하려고 한다면(퇴근하고 집에가서 일을 더 한다는게 이상하게 느껴지긴 하는데;) 그 완전하지 않은 상태로 푸시하고 집에서 풀 이후에 작업하는게 맞는걸까? 아니면 다른 방법이 있을까?? 궁금해졌다.

이전에 자바로 웹 어플리케이션을 개발할 때는 바로 스프링 부트를 사용했는데, 지금 프로젝트 방향은 기본 프로젝트 Gradle 프로젝트로 바꾸게 됐다. 그러면서 프로젝트 구조에 대한 이해도 늘었고 이전에는 막연하게 IntelliJ에서 Gradle 알아서 사용해준 느낌이었는데, Gradle 명령어나 CMD에서 사용하는 법도 공부 할 수 있어서 좋았다.

+ Recent posts