📌 3월 4일
프로젝트를 시작하기로 하고 아이디어를 구상해온 뒤 처음 미팅한 날!
여러 아이디어 중 2가지를 선정했다.
1) 간단한 테스트를 즐길 수 있는 웹사이트 (사용자가 테스트 만들기도 가능)
2) 면접 시뮬레이션 웹사이트 (사용자가 질문 kit 지정하거나 만들어서 면접 응시, kit는 공유 가능)
그리고 이 내용을 각자 디벨롭해와서 다음 미팅 때 최종 결정하기로.
📌 3월 6일
아이디어를 구체화하여 최종 선정했다.우리가 만들기로 한 프로젝트는 '테스트를 직접 만들고 즐기는 테스트 풀기 웹 플랫폼'.사람들이 짜투리 시간을 할애하여 툴(테스트)을 만든다는 의미로 프로젝트명은 '짜툴'!! 이다.듣기 강렬하기도 해서 선정 ^0^,, ㅎㅎ (팀명은 타임킬러 ㅋㅋㅋㅋㅋㅋ)
우리는 슬랙, 노션, 깃허브를 통해 협업하는 것으로 정했다.
오늘 정하게 된 것은 '팀 규칙', 그리고 '깃 규칙'!
노션에 잘 정리해놓았다.
📌 3월 14일
스프링 프로젝트를 생성하고, 깃 레포지토리를 만들었다!
그리고 각자 맡을 기능을 나누었다.
내가 맡은 기능은,
마이페이지_내가 만든 테스트 조회
테스트 상세 조회
테스트 결과 조회 (마이페이지_내가 푼 테스트 조회)
한줄평 조회 및 클린봇 활용
테스트 링크 공유
테스트 추천 (시간이 된다면 AI 기반 혹은 빅데이터 기반 추천이 가능하도록 해볼까 고민중이다)
또한 다음 미팅까지 각자 할 부분을 맡았고, 나는 Entity 생성을 맡게 되었다.
아래는 내가 한 부분!

코드는 길기 때문에 접은 글로..
⬇️ 1. Test 패키지 entity 코드들
1. Test
package com.timekiller.zzatool.test.entity;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import java.util.Date;
import java.util.List;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "Test")
@DynamicInsert
@SequenceGenerator(
name = "test_no_seq_generator",
sequenceName = "test_no_seq",
initialValue = 1,
allocationSize = 1)
/* 테스트 Entity */
public class Test {
// [PK] 테스트 아이디
@Id
@Column(name = "test_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "test_no_seq_generator")
private Long testId;
// 테스트 제목
@Column(name = "test_title")
@NotNull
private String testTitle;
// [FK] 회원 아이디
@Column(name = "member_id")
@NotNull
private Long memberId;
// 테스트 제작일
@Column(name = "test_date")
@ColumnDefault(value = "sysdate()")
private Date testDate;
// 테스트 이미지
@Column(name = "test_image")
private String testImage;
// 테스트 제출 횟수
@Column(name = "test_count")
@ColumnDefault(value = "0")
private Long testCount;
// 한줄평 목록
@OneToMany(cascade = CascadeType.REMOVE)
@JoinColumn(name = "test_id")
private List<Comment> commentList;
// 문제 목록
@OneToMany(cascade = CascadeType.REMOVE)
@JoinColumn(name = "test_id")
private List<Quiz> quizList;
}
2. Quiz
package com.timekiller.zzatool.test.entity;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import java.util.List;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "Quiz")
@DynamicInsert
@SequenceGenerator(
name = "quiz_no_seq_generator",
sequenceName = "quiz_no_seq",
initialValue = 1,
allocationSize = 1)
/* 문제 Entity */
public class Quiz {
// [PK] 문제 아이디
@Id
@Column(name = "quiz_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "quiz_no_seq_generator")
private Long quizId;
// 문제 내용
@Column(name = "quiz_content")
@NotNull
private String quizContent;
// 문제 이미지
@Column(name = "quiz_image")
private String quizImage;
// [FK] 테스트 아이디
@Column(name = "test_id")
@NotNull
private Long testId;
// 정답 횟수
@Column(name = "correct_count")
@ColumnDefault(value = "0")
private Long correctCount;
// 정답률
@Column(name = "correct_rate")
@ColumnDefault(value = "0.0")
private Float correctRate;
// 보기 목록
@OneToMany(cascade = CascadeType.REMOVE)
@JoinColumn(name="quiz_id")
private List<View> viewList;
}
3. View
package com.timekiller.zzatool.test.entity;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.DynamicInsert;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "View")
@DynamicInsert
@SequenceGenerator(
name = "view_no_seq_generator",
sequenceName = "view_no_seq",
initialValue = 1,
allocationSize = 1)
/* 보기 Entity */
public class View {
// [PK] 보기 아이디
@Id
@Column(name = "view_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "view_no_seq_generator")
private Long viewId;
// 보기 내용
@Column(name = "view_content")
@NotNull
private String viewContent;
// [FK] 문제 아이디
@Column(name = "quiz_id")
@NotNull
private Long quizId;
// 보기 번호
@Column(name = "view_number")
private Integer viewNumber;
// 정답 여부
@Column(name = "is_correct")
private Integer isCorrect;
}
4. Comment
package com.timekiller.zzatool.test.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import jakarta.validation.constraints.NotNull;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import java.util.Date;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "Comment")
@DynamicInsert
@SequenceGenerator(
name = "comment_no_seq_generator",
sequenceName = "comment_no_seq",
initialValue = 1,
allocationSize = 1)
/* 댓글 Entity */
public class Comment {
// [PK] 댓글 아이디
@Id
@Column(name = "comment_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "comment_no_seq_generator")
private Long commentId;
// [FK] 테스트 아이디
@Column(name = "test_id")
@NotNull
private Long testId;
// 댓글 내용
@Column(name = "comment_content")
@NotNull
private String commentContent;
// 작성자 닉네임
@Column(name = "comment_writer")
@ColumnDefault(value = "익명")
private String commentWriter;
// 댓글 작성일
@Column(name = "comment_date")
@ColumnDefault(value = "sysdate()")
private Date commentDate;
}
⬇️ 2. Result 패키지 entity 코드들
1. Result
package com.timekiller.zzatool.result.entity;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicInsert;
import java.util.Date;
import java.util.List;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "Result")
@DynamicInsert
@SequenceGenerator(
name = "result_no_seq_generator",
sequenceName = "result_no_seq",
initialValue = 1,
allocationSize = 1)
/* 결과 Entity */
public class Result {
// [PK] 결과 아이디
@Id
@Column(name = "result_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "result_no_seq_generator")
private Long resultId;
// 결과 점수
@Column(name = "result_score")
@NotNull
private Integer resultScore;
// [FK] 회원 아이디
@Column(name = "member_id")
@NotNull
private Long memberId;
// [FK] 테스트 아이디
@Column(name = "test_id")
@NotNull
private Long testId;
// 제출일
@Column(name = "result_date")
@ColumnDefault(value = "sysdate()")
private Date resultDate;
// 결과 보기 목록
@OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)
@JoinColumn(name = "result_id")
private List<ResultView> resultViewList;
}
2. ResultViewKey
package com.timekiller.zzatool.result.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Embeddable
public class ResultViewKey implements Serializable {
// [FK] 결과 아이디
@Column(name = "result_id")
@NotNull
private Long resultId;
// [FK] 보기 아이디
@Column(name = "view_id")
@NotNull
private Long viewId;
}
3. ResultView
package com.timekiller.zzatool.result.entity;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.DynamicInsert;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "ResultView")
@DynamicInsert
/* 결과 보기 Entity */
public class ResultView {
@EmbeddedId private ResultViewKey id = new ResultViewKey();
}
📌 3월 19일
오늘 미팅에선 entity, erd를 조금 수정하고 각자 해온 부분 이야기!
이제 진짜 개발을 시작하기 위한 준비를 했다.
1. intelliJ 설정
- google-java-format plugin
- gradle → intellij IDEA
- annotation proccessing (lombok)
- file encoding
- action on save
2. github 설정
- branch protection rule
: dev에만 적용, merge 전에 승인 필요, 코멘트 단 것 solve 필요
3. github action
format check
Run axel-op/googlejavaformat-action@v3
Version of JDK: 17
Downloading Google Java Format
/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.10-7/x64/bin/java --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED -jar /home/runner/google-java-format.jar --replace --aosp /home/runner/work/zZatool/zZatool/src/main/java/com/timekiller/zzatool/ZzatoolApplication.java /home/runner/work/zZatool/zZatool/src/test/java/com/timekiller/zzatool/ZzatoolApplicationTests.java
Committing changes
/usr/bin/git commit --all -m style: reformat by google-java-format
[feat-workflow 4cfab26] style: reformat by google-java-format
2 files changed, 5 insertions(+), 8 deletions(-)
/usr/bin/git push
remote: Permission to leejaeseong11/zZatool.git denied to github-actions[bot].
fatal: unable to access 'https://github.com/leejaeseong11/zZatool/': The requested URL returned error: 403
Error: The command 'git' failed with exit code 128

4. 배포 (예정)
Docker 개발환경 구축 → 프로젝트 빌드 ./gradlew clean build
다음 미팅 전까지 할 일!!!
db 연결을 마치기 + 각자 기능에 대한 요구사항 명세서 작성해오기!
다음 글은 요구사항 명세서와 db 연결, 개발 코드에 대한 내용을 작성해야겠다.
플젝 파이튕~ 🐾
'🐾 개발' 카테고리의 다른 글
| 프로젝트 : 짜툴 (3) 240330 ~ 240331 (2) | 2024.04.02 |
|---|---|
| 프로젝트 : 짜툴 (2) 240320 ~ 240325 (0) | 2024.03.31 |
| [MacOS M2] MySQL 설치하기 (feat. homebrew) (0) | 2024.03.20 |
| [MacOS M2] homebrew 설치하기 (0) | 2024.03.20 |
| 미니 프로젝트 : Mango3 (1) (1) | 2024.02.23 |