본문 바로가기

🐾 개발

프로젝트 : 짜툴 (1) 240304 ~ 240319

📌 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 연결, 개발 코드에 대한 내용을 작성해야겠다.

플젝 파이튕~ 🐾