# 개요

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

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

세미 프로젝트 주제로 내 개인 프로젝트가 채택됐다.

 


 

# 세미 팀 프로젝트

강사님이 팀을 짜주었고, 우리 팀이 모이자마자 "그래도 해본 사람이 조장을 하는게 낫지 않겠어요?"시전으로 팀장을 맡게 되었다;

주제 의견을 회의했었는데, 내가 혼자 진행하던 플래너를 팀 프로젝트로 하는게 어떻냐는 의견을 냈는데 (사실은 주제 생각하기 귀찮아서;;) 그러기로 했다.

 


 

# 유사 어플리케이션 조사

 

Focus To-Do: 뽀모도로 타이머 + 업무 관리

⏱ 포모도로 타이머 ✅ 업무 관리자 📊타임 트래커 📅 스케쥴 플래너 🔔 알림

chromewebstore.google.com

유사 어플리케이션은 많았지만 초기에 내가 계획했던 뽀모도로 타이머를 기준으로 잡기로 했다. 가장 큰 이유는 간단하다고 생각해서.

애초에 나를 제외하고는 다들 개발이 처음이었기 때문에, 뭔가 대단한걸 만드는 것 보다는 간단한 프로젝트를 통해서 성취감을 느끼는 것이 중요하다고 생각했다.

 


 

# 팀 개발 방향성(?)

내가 팀장이고, 개발 프로세스 방향을 생각 해 봤을 때 진도에 맞춰서 진행하는게 낫겠다고 생각했다.

당연히 웹 어플리케이션을 만들 것이지만, 서블릿 및 JSP 관련 진도가 안나갔기 때문에 지금까지 배워 온 데이터베이스 연결(JDBC), Html/Css/JavaScript 부분을 다 같이 하고 서버와의 연결은 내가 맡아서 했다.

설계 및 개발 과정에서도 최대한 팀원들의 의견을 따르려고 했다.

 

## 테이블 설계 및 DDL 작성

내가 처음 계획했던 것은 간단하게 Plan과 User에 대한 테이블만 있으면 된다고 생각했는데, 회의를 하다보니 조금 확장 되었다.

회의를 통해 처음 나온 테이블 및 attribute(속성) 정보이다. 몇몇 속성은 당장 필요하지 않은 것인데도 불구하고 넣었다. 회의를 하는데 계속 당장 필요하고 필수적인 속성을 얘기하지 않고 이후의 부수적인 속성 얘기가 계속 나왔다. 지금 당장 필요한 것은 아니고 설계는 언제든지 변할 수 있으니 지금 당장 필요한 것만 기입하고 DDL을 작성하자고 얘기했는데 잘 받아들이지 못한 것 같다. 그래서 어쩔 수 없이 일단 다 넣었다.

-- ORACLE

CREATE TABLE USERS (
    USERNO NUMBER PRIMARY KEY,
    USERID VARCHAR2(20) UNIQUE NOT NULL,
    USERPW VARCHAR2(20) NOT NULL,
    USERNAME VARCHAR2(20) NOT NULL,
    NICKNAME VARCHAR2(20) NOT NULL UNIQUE,
    EMAIL VARCHAR2(30) NOT NULL,
    PHONE VARCHAR2(15),
    SSN VARCHAR2(30) UNIQUE NOT NULL,
    ADDRESS VARCHAR2(100) NOT NULL,
    INTEREST VARCHAR2(500),
    ENROLLDATE DATE);
    
CREATE SEQUENCE SEQ_USER
NOCACHE;

CREATE TABLE PLANNER (
    PLANNO NUMBER PRIMARY KEY,
    WRITERNO NUMBER REFERENCES USERS ON DELETE CASCADE,
    TITLE VARCHAR2(30) NOT NULL,
    CREATEDATE DATE,
    STARTDATE DATE,
    ENDDATE DATE,
    REMINDALARM DATE,
    REPEATTASK_YN CHAR(3) DEFAULT 'N' CHECK(REPEATTASK_YN IN ('Y', 'N')),
    COMPLETE_YN CHAR(3) CHECK(COMPLETE_YN IN ('Y', 'N'))
);

CREATE SEQUENCE SEQ_PLAN
NOCACHE;

CREATE TABLE DETAIL (
    DETAILNO NUMBER PRIMARY KEY,
    PLANNO NUMBER REFERENCES PLANNER ON DELETE CASCADE,
    DETATILNAME VARCHAR2(30),
    CONTENTS VARCHAR2(50),
    STARTTIME DATE,
    ENTTIME DATE,
    ALARM DATE,
    REPEAT_YN CHAR(3) DEFAULT 'N' CHECK(REPEATTASK_YN IN ('Y', 'N')),
    PRIORITY NUMBER DEFAULT 1 CHECK(PLAN_PRIORITY IN (1,2,3)),
    COMPLETE_YN CHAR(3) CHECK(COMPLETE_YN IN ('Y', 'N'))
);    
    
CREATE SEQUENCE SEQ_DETAIL
NOCACHE;

 


 

# git, github, gradle 알려주기

git에 대한 지식을 알고 있어야 팀 프로젝트를 원활하게 진행할 수 있기 때문에 가르치려고 했다.

또한, 빌드 및 라이브러리 관리를 gradle로 할 계획이어서 이것 또한 알려줘야했다. 그동안 학원에서 배운 것은 직접 jar파일을 설치해서 build path에 등록하는 방식으로 라이브러리를 추가했었는데, 너무 불편하다고 느꼈기 때문에 gradle를 사용하려고 했다.

하지만 문제가 있었는데, 나는 intelliJ를 쓰고 조원들은 eclipse를 썼다. 나는 eclipse가 익숙하지 않아서 가르치기가 어려웠다.

사실 처음부터 CLI로 배우면 어느 IDE를 쓰던 잘 쓸 수 있었을텐데 팀원들이 CLI랑 친하지 않았다.. 이 기회에 친해졌으면 그냥 좋았을텐데 되게 어려워해서 어쩔 수 없이 내가 eclipse에 맞춰 알려주기로 했다.

나름 정리하며 알려주려고 노력했는데, 잘 되었는지는 모르겠다 ㅋㅋ... 아래 링크는 내가 가르치기 위해 정리한 내용이다.

 

 

Task | Notion

Git

tin-digit-d17.notion.site

 

커밋, push, PR 과정이랑 -부분 +부분 어떻게 다른지, 어떻게 하면 충돌이나고 해결할 수 있는지 알려주려고 여러 테스트 커밋을 했었다 ㅋㅋ...


 

# 간단 회고

팀 프로젝트 과정 글 쓰는 시점은 팀 프로젝트가 끝난 이후인데, 역시 미리 작성하지 않으니 그 때의 기억이 잘 나지 않는다.

상세하게 까진 아니더라도 메모하는 습관을 들여야겠다 ㅜ

근데 위에 정리한 git, gradle 관련 노션 글을 보니 "열심히는 했다"라고 느껴지긴 한다 ㅋㅋ... 설명은 잘 못했지만..

 

# 개요

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

# 개요

항상 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