diff --git a/.gitignore b/.gitignore index c2065bc26..5ca2add7d 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,8 @@ out/ ### VS Code ### .vscode/ + +### Custom ### +db_dev.mv.db +db_dev.trace.db +.env \ No newline at end of file diff --git a/src/main/java/com/back/BackApplication.java b/src/main/java/com/back/BackApplication.java index e5e900c6b..a15f5d534 100644 --- a/src/main/java/com/back/BackApplication.java +++ b/src/main/java/com/back/BackApplication.java @@ -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 BackApplication { diff --git a/src/main/java/com/back/entity/Member.java b/src/main/java/com/back/entity/Member.java new file mode 100644 index 000000000..d54a1d28c --- /dev/null +++ b/src/main/java/com/back/entity/Member.java @@ -0,0 +1,21 @@ +package com.back.entity; + +import com.back.jpa.entity.BaseIdAndTime; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor +public class Member extends BaseIdAndTime { + @Column(unique = true) + private String username; + private String password; + private String nickname; + + public Member(String username, String password, String nickname) { + this.username = username; + this.password = password; + this.nickname = nickname; + } +} diff --git a/src/main/java/com/back/exception/DomainException.java b/src/main/java/com/back/exception/DomainException.java new file mode 100644 index 000000000..6bb5a5b69 --- /dev/null +++ b/src/main/java/com/back/exception/DomainException.java @@ -0,0 +1,15 @@ +package com.back.exception; + +import lombok.Getter; + +@Getter +public class DomainException extends RuntimeException { + private final String resultCode; + private final String msg; + + public DomainException(String resultCode, String msg) { + super(resultCode + " : " + msg); + this.resultCode = resultCode; + this.msg = msg; + } +} \ No newline at end of file diff --git a/src/main/java/com/back/initData/DataInit.java b/src/main/java/com/back/initData/DataInit.java new file mode 100644 index 000000000..6c331a4f5 --- /dev/null +++ b/src/main/java/com/back/initData/DataInit.java @@ -0,0 +1,41 @@ +package com.back.initData; + +import com.back.entity.Member; +import com.back.service.MemberService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.transaction.annotation.Transactional; + +@Configuration +@Slf4j +public class DataInit { + private final DataInit self; + private final MemberService memberService; + + public DataInit(@Lazy DataInit self, MemberService memberService) { + this.self = self; + this.memberService = memberService; + } + + @Bean + public ApplicationRunner baseInitDataRunner() { + return args -> { + self.makeBaseMembers(); + }; + } + + @Transactional + public void makeBaseMembers() { + if (memberService.count() > 0) return; + + Member systemMember = memberService.join("system", "1234", "시스템"); + Member holdingMember = memberService.join("holding", "1234", "홀딩"); + Member adminMember = memberService.join("admin", "1234", "관리자"); + Member user1Member = memberService.join("user1", "1234", "유저1"); + Member user2Member = memberService.join("user2", "1234", "유저2"); + Member user3Member = memberService.join("user3", "1234", "유저3"); + } +} diff --git a/src/main/java/com/back/jpa/entity/BaseEntity.java b/src/main/java/com/back/jpa/entity/BaseEntity.java new file mode 100644 index 000000000..1b8b63726 --- /dev/null +++ b/src/main/java/com/back/jpa/entity/BaseEntity.java @@ -0,0 +1,16 @@ +package com.back.jpa.entity; + +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Getter +// 모든 엔티티들의 조상 +public class BaseEntity { + public String getModelTypeCode() { + return this.getClass().getSimpleName(); + } +} \ No newline at end of file diff --git a/src/main/java/com/back/jpa/entity/BaseIdAndTime.java b/src/main/java/com/back/jpa/entity/BaseIdAndTime.java new file mode 100644 index 000000000..20d24903f --- /dev/null +++ b/src/main/java/com/back/jpa/entity/BaseIdAndTime.java @@ -0,0 +1,27 @@ +package com.back.jpa.entity; + +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +import static jakarta.persistence.GenerationType.IDENTITY; + +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Getter +public class BaseIdAndTime extends BaseEntity { + @Id + @GeneratedValue(strategy = IDENTITY) + private int id; + @CreatedDate + private LocalDateTime createDate; + @LastModifiedDate + private LocalDateTime modifyDate; +} diff --git a/src/main/java/com/back/repository/MemberRepository.java b/src/main/java/com/back/repository/MemberRepository.java new file mode 100644 index 000000000..a23150b5e --- /dev/null +++ b/src/main/java/com/back/repository/MemberRepository.java @@ -0,0 +1,10 @@ +package com.back.repository; + +import com.back.entity.Member; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface MemberRepository extends JpaRepository { + Optional findByUsername(String username); +} \ No newline at end of file diff --git a/src/main/java/com/back/service/MemberService.java b/src/main/java/com/back/service/MemberService.java new file mode 100644 index 000000000..91b3bca81 --- /dev/null +++ b/src/main/java/com/back/service/MemberService.java @@ -0,0 +1,33 @@ +package com.back.service; + +import com.back.entity.Member; +import com.back.exception.DomainException; +import com.back.repository.MemberRepository; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class MemberService { + private final MemberRepository memberRepository; + + public MemberService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } + + public long count() { + return memberRepository.count(); + } + + public Member join(String username, String password, String nickname) { + findByUsername(username).ifPresent(m -> { + throw new DomainException("409-1", "이미 존재하는 username 입니다."); + }); + + return memberRepository.save(new Member(username, password, nickname)); + } + + public Optional findByUsername(String username) { + return memberRepository.findByUsername(username); + } +} \ No newline at end of file diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml new file mode 100644 index 000000000..db7b0d328 --- /dev/null +++ b/src/main/resources/application-dev.yml @@ -0,0 +1,6 @@ +spring: + datasource: + url: jdbc:h2:./db_dev;MODE=MySQL + username: sa + password: + driver-class-name: org.h2.Driver diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 24229f339..000000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=back diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 000000000..3e9a9ffc6 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,30 @@ +server: + port: 8080 +spring: + application: + name: back + profiles: + active: dev + output: + ansi: + enabled: always + jackson: + serialization: + fail-on-empty-beans: false + jpa: + hibernate: + ddl-auto: update + open-in-view: false + show-sql: true + properties: + hibernate: + format_sql: true + highlight_sql: true + use_sql_comments: true + default_batch_fetch_size: 100 +logging: + level: + com.back: DEBUG + org.hibernate.orm.jdbc.bind: TRACE + org.hibernate.orm.jdbc.extract: TRACE + org.springframework.transaction.interceptor: TRACE