Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: UserEntity와 UserRepository 개발 #5

Merged
merged 9 commits into from
Dec 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .github/workflows/type-labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,61 +16,61 @@ jobs:

- name: add ✨ feature label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'feat:') }}
if: startsWith(github.event.pull_request.title, 'feat:')
with:
labels: ✨ feature

- name: add 🐛 bug-fix label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'fix:') }}
if: startsWith(github.event.pull_request.title, 'fix:')
with:
labels: 🐛 bug-fix

- name: add ♻️ refactor label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'refactor:') }}
if: startsWith(github.event.pull_request.title, 'refactor:')
with:
labels: ♻️ refactor

- name: add 🎨 style label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'style:') }}
if: startsWith(github.event.pull_request.title, 'style:')
with:
labels: 🎨 style

- name: add 🏗️ build label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'chore:') }}
if: startsWith(github.event.pull_request.title, 'chore:')
with:
labels: 🏗️ build

- name: add ✅ test label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'test:') }}
if: startsWith(github.event.pull_request.title, 'test:')
with:
labels: ✅ test

- name: add 📝 docs label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'docs:') }}
if: startsWith(github.event.pull_request.title, 'docs:')
with:
labels: 📝 docs

- name: add 👷 ci label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'ci:') }}
if: startsWith(github.event.pull_request.title, 'ci:')
with:
labels: 👷 ci

- name: add ⚡️ perf label
uses: actions-ecosystem/action-add-labels@v1
if: startsWith(github.event.pull_request.title, 'perf:') }}
if: startsWith(github.event.pull_request.title, 'perf:')
with:
labels: ⚡️ perf

- name: add 🔖 release label
uses: actions-ecosystem/action-add-labels@v1
if: ${{ startsWith(github.event.pull_request.title, 'release:') }}
if: ${{ startsWith(github.event.pull_request.title, 'release:')
with:
labels: 🔖 release

2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {

apply from: "gradle/spring.gradle"
apply from: "gradle/devtool.gradle"
apply from: "gradle/junit.gradle"
apply from: "gradle/test.gradle"
apply from: "gradle/sonar.gradle"
apply from: "gradle/db.gradle"

Expand Down
3 changes: 2 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
projectGroup=net.teumteum
projectVersion=1.0

### JUNIT ###
### TEST ###
junitVersion=5.10.1
assertJVersion=3.24.2

### LOMBOK ###
lombokVersion=1.18.30
Expand Down
2 changes: 2 additions & 0 deletions gradle/junit.gradle → gradle/test.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ allprojects {
testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}"
testImplementation "org.junit.jupiter:junit-jupiter-params:${junitVersion}"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}"

testImplementation "org.assertj:assertj-core:${assertJVersion}"
}
}
2 changes: 2 additions & 0 deletions src/main/java/net/teumteum/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@SpringBootApplication
public class Application {

Expand Down
35 changes: 35 additions & 0 deletions src/main/java/net/teumteum/core/entity/TimeBaseEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package net.teumteum.core.entity;

import jakarta.persistence.Column;
import jakarta.persistence.MappedSuperclass;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import java.time.Instant;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@MappedSuperclass
public abstract class TimeBaseEntity {

@Column(name = "created_at", columnDefinition = "TIMESTAMP(6)", nullable = false, updatable = false)
protected Instant createdAt;

@Column(name = "updated_at", columnDefinition = "TIMESTAMP(6)", nullable = false)
protected Instant updatedAt;

@PrePersist
void prePersist() {
var now = Instant.now();

createdAt = createdAt != null ? createdAt : now;
updatedAt = updatedAt != null ? updatedAt : now;
}

@PreUpdate
void preUpdate() {
updatedAt = updatedAt != null ? updatedAt : Instant.now();
}

}
24 changes: 24 additions & 0 deletions src/main/java/net/teumteum/user/domain/ActivityArea.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package net.teumteum.user.domain;


import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embeddable;
import java.util.ArrayList;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class ActivityArea {

@Column(name = "city")
private String city;

@ElementCollection
private List<String> street = new ArrayList<>();
}
27 changes: 27 additions & 0 deletions src/main/java/net/teumteum/user/domain/Job.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package net.teumteum.user.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class Job {

@Column(name = "job_name")
private String name;

@Column(name = "certificated")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

인증 부분 밖으로 User 도메인쪽으로 빼기로 했었는데 혹시 안에 넣는게 나을까요?
혹시나 빼게된다면 JobCertificated로 가면 좋을 것 같아요!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

유저 도메인 만들고 비슷한 필드들 묶다보니까 이렇게 묶인거 같은데! 저는 같이 있을때 자연스러워 보이는거 같아요
혹시, 분리되어야 하는 이유가 잘 기억이 안나서 한번 더 설명해주실 수 있나요? ㅠㅠ (진짜 기억안남)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넣어있는게 조금 자연스러워 보이긴하는데 JobStatus 는 어떻게 생각하세요!?!

private boolean certificated;

@Column(name = "job_class")
private String jobClass;

@Column(name = "detail_job_class")
private String detailJobClass;

}
9 changes: 9 additions & 0 deletions src/main/java/net/teumteum/user/domain/JobStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package net.teumteum.user.domain;

public enum JobStatus {

직장인,
학생,
취업준비생,

}
21 changes: 21 additions & 0 deletions src/main/java/net/teumteum/user/domain/Oauth.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package net.teumteum.user.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class Oauth {

@Column(name = "oauth_authenticate_info", unique = true)
private String oAuthAuthenticateInfo;

@Column(name = "authenticated")
private String authenticated;

}
28 changes: 28 additions & 0 deletions src/main/java/net/teumteum/user/domain/Terms.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package net.teumteum.user.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.persistence.PrePersist;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.util.Assert;

@Getter
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class Terms {

@Column(name = "terms_of_service", nullable = false)
private Boolean service;

@Column(name = "privacy_policy", nullable = false)
private Boolean privacyPolicy;

@PrePersist
private void assertTerms() {
Assert.isTrue(service, () -> "서비스 이용 약관은 항상 동의 되어야 합니다.");
Assert.isTrue(privacyPolicy, () -> "개인정보 처리 방침은 항상 동의 되어야 합니다.");
}
}
78 changes: 78 additions & 0 deletions src/main/java/net/teumteum/user/domain/User.java
ddingmin marked this conversation as resolved.
Show resolved Hide resolved
ddingmin marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package net.teumteum.user.domain;

import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.PrePersist;
import java.util.ArrayList;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import net.teumteum.core.entity.TimeBaseEntity;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.util.Assert;

@Getter
@Entity(name = "users")
@NoArgsConstructor
@AllArgsConstructor
public class User extends TimeBaseEntity {

@Id
@Column(name = "id")
private Long id;

@Column(name = "name", length = 10)
private String name;

@Column(name = "birth", length = 10)
@DateTimeFormat(pattern = "yyyy.MM.dd")
private String birth;

@Column(name = "character_id")
private Long characterId;

@Column(name = "manner_temperature")
private int mannerTemperature;

@Embedded
private Oauth oauth;

@Embedded
private ActivityArea activityArea;

@Column(name = "mbti", length = 4)
private String mbti;

@Column(name = "status")
@Enumerated(EnumType.STRING)
private JobStatus status;

@Column(name = "goal", length = 50)
private String goal;

@Embedded
private Job job;

@ElementCollection
ddingmin marked this conversation as resolved.
Show resolved Hide resolved
private List<String> interests = new ArrayList<>();

@Embedded
private Terms terms;

@PrePersist
private void assertField() {
assertName();
}

private void assertName() {
Assert.doesNotContain(name, " ", () -> "이름에 공백이 포함되어 있습니다. \"" + name + "\"");
Assert.isTrue(name.length() >= 2 && name.length() <= 10, () -> "이름은 2자 ~ 10자 사이가 되어야 합니다. \"" + name + "\"");
}

}
8 changes: 8 additions & 0 deletions src/main/java/net/teumteum/user/domain/UserConnector.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package net.teumteum.user.domain;

import java.util.Optional;

public interface UserConnector {

Optional<User> findUserById(Long id);
}
7 changes: 7 additions & 0 deletions src/main/java/net/teumteum/user/domain/UserRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.teumteum.user.domain;

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {

}
23 changes: 23 additions & 0 deletions src/main/java/net/teumteum/user/service/UserConnectorImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package net.teumteum.user.service;

import java.util.Optional;
import lombok.RequiredArgsConstructor;
import net.teumteum.user.domain.User;
import net.teumteum.user.domain.UserConnector;
import net.teumteum.user.domain.UserRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class UserConnectorImpl implements UserConnector {

private final UserRepository userRepository;

@Override
public Optional<User> findUserById(Long id) {
return userRepository.findById(id);
}

}
Empty file.
Loading