Skip to content

Commit

Permalink
feat: UserEntity와 UserRepository 개발 (#5)
Browse files Browse the repository at this point in the history
* feat: UserEntity와 UserRepository를 개발한다

* feat: User도메인 을 수정하고, UserConnector를 구현한다

* refactor: ddl에 oauth정보를 추가한다

* ci: type-labeler 의 오타를 수정한다

* refactor: 유저도메인의 Character를 통합시킨다

* feat: User도메인에 약관 도메인을 추가한다

* feat: 유저 생성 및 수정시간을 추가한다

* refactor: List에 기본값을 바인딩한다

* refactor: street에 기본생성자를 추가한다
  • Loading branch information
devxb authored Dec 27, 2023
1 parent 2b3ee61 commit d129d49
Show file tree
Hide file tree
Showing 22 changed files with 555 additions and 12 deletions.
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")
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
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
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

0 comments on commit d129d49

Please sign in to comment.