From 670f6820f36f857674da3a7e8078054eecf560d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8F=99=EC=9A=B1=5Cdongw?= Date: Thu, 27 Feb 2025 23:30:25 +0900 Subject: [PATCH 1/4] =?UTF-8?q?add=20:=20entity=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cdbd/hr/domain/att/Attendance.java | 28 ++++++++++ .../cdbd/hr/domain/att/IDTypes/LeaveType.java | 22 ++++++++ .../cdbd/hr/domain/att/IDTypes/ShiftId.java | 24 +++++++++ .../cdbd/hr/domain/att/Leave/LeaveMng.java | 26 ++++++++++ .../cdbd/hr/domain/att/Leave/LeaveUsage.java | 22 ++++++++ .../com/cdbd/hr/domain/att/Shift/Shift.java | 21 ++++++++ .../cdbd/hr/domain/att/TaskAdjustment.java | 23 ++++++++ .../cdbd/hr/domain/dep/IDTypes/DepCode.java | 22 ++++++++ .../dep/convert/impl/JpaDepConverter.java | 38 ++++++++++++++ .../com/cdbd/hr/domain/emp/EmpDep/EmpDep.java | 26 ++++++++++ .../com/cdbd/hr/domain/emp/EmpFactory.java | 5 ++ .../hr/domain/emp/convert/EmpConverter.java | 8 +++ .../emp/convert/impl/JpaEmpConverter.java | 52 +++++++++++++++++++ 13 files changed, 317 insertions(+) create mode 100644 src/main/java/com/cdbd/hr/domain/att/Attendance.java create mode 100644 src/main/java/com/cdbd/hr/domain/att/IDTypes/LeaveType.java create mode 100644 src/main/java/com/cdbd/hr/domain/att/IDTypes/ShiftId.java create mode 100644 src/main/java/com/cdbd/hr/domain/att/Leave/LeaveMng.java create mode 100644 src/main/java/com/cdbd/hr/domain/att/Leave/LeaveUsage.java create mode 100644 src/main/java/com/cdbd/hr/domain/att/Shift/Shift.java create mode 100644 src/main/java/com/cdbd/hr/domain/att/TaskAdjustment.java create mode 100644 src/main/java/com/cdbd/hr/domain/dep/IDTypes/DepCode.java create mode 100644 src/main/java/com/cdbd/hr/domain/dep/convert/impl/JpaDepConverter.java create mode 100644 src/main/java/com/cdbd/hr/domain/emp/EmpDep/EmpDep.java create mode 100644 src/main/java/com/cdbd/hr/domain/emp/EmpFactory.java create mode 100644 src/main/java/com/cdbd/hr/domain/emp/convert/EmpConverter.java create mode 100644 src/main/java/com/cdbd/hr/domain/emp/convert/impl/JpaEmpConverter.java diff --git a/src/main/java/com/cdbd/hr/domain/att/Attendance.java b/src/main/java/com/cdbd/hr/domain/att/Attendance.java new file mode 100644 index 0000000..dd9c7ee --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/att/Attendance.java @@ -0,0 +1,28 @@ +package com.cdbd.hr.domain.att; + +import java.sql.Timestamp; +import java.time.LocalTime; + +import com.cdbd.hr.domain.common.DomainEntity; +import com.cdbd.hr.domain.emp.IDTypes.EmpId; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +@DomainEntity +public class Attendance { + + private EmpId empId; + private String stdYmd; + private String holidayYn; + private String inTime; + private String outTime; + private LocalTime workHours; + private LocalTime breakHours; + private LocalTime overTimeHours; + private LocalTime nightWorkHours; + private Timestamp createdAt; + private Timestamp updatedAt; +} diff --git a/src/main/java/com/cdbd/hr/domain/att/IDTypes/LeaveType.java b/src/main/java/com/cdbd/hr/domain/att/IDTypes/LeaveType.java new file mode 100644 index 0000000..1d5b2b2 --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/att/IDTypes/LeaveType.java @@ -0,0 +1,22 @@ +package com.cdbd.hr.domain.att.IDTypes; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class LeaveType { + + private String ShiftId; + + + public static LeaveType valueOf(String value) { + return new LeaveType(value); + } + +} + + + + + \ No newline at end of file diff --git a/src/main/java/com/cdbd/hr/domain/att/IDTypes/ShiftId.java b/src/main/java/com/cdbd/hr/domain/att/IDTypes/ShiftId.java new file mode 100644 index 0000000..b23c06d --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/att/IDTypes/ShiftId.java @@ -0,0 +1,24 @@ +package com.cdbd.hr.domain.att.IDTypes; + +import com.cdbd.hr.infrastructure.jpa.entity.ShiftJpaEntity; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ShiftId { + + private String ShiftId; + + + public static ShiftId valueOf(String value) { + return new ShiftId(value); + } + +} + + + + + \ No newline at end of file diff --git a/src/main/java/com/cdbd/hr/domain/att/Leave/LeaveMng.java b/src/main/java/com/cdbd/hr/domain/att/Leave/LeaveMng.java new file mode 100644 index 0000000..0004c20 --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/att/Leave/LeaveMng.java @@ -0,0 +1,26 @@ +package com.cdbd.hr.domain.att.Leave; + +import java.sql.Timestamp; + +import com.cdbd.hr.domain.att.IDTypes.LeaveType; +import com.cdbd.hr.domain.common.DomainEntity; +import com.cdbd.hr.domain.emp.IDTypes.EmpId; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +@DomainEntity +public class LeaveMng { + + private LeaveType leaveType; + private EmpId empId; + private String staYmd; + private String endYmd; + private Integer totCnt; + private Integer usedCount; + private Integer remainCount; + private Timestamp createdAt; + private Timestamp updatedAt; +} diff --git a/src/main/java/com/cdbd/hr/domain/att/Leave/LeaveUsage.java b/src/main/java/com/cdbd/hr/domain/att/Leave/LeaveUsage.java new file mode 100644 index 0000000..e2176aa --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/att/Leave/LeaveUsage.java @@ -0,0 +1,22 @@ +package com.cdbd.hr.domain.att.Leave; + +import java.sql.Timestamp; + +import com.cdbd.hr.domain.common.DomainEntity; +import com.cdbd.hr.domain.emp.IDTypes.EmpId; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +@DomainEntity +public class LeaveUsage { + + private EmpId empId; + private String leaveType; + private String stdYmd; + private Integer usedCount; + private Timestamp createdAt; + private Timestamp updatedAt; +} diff --git a/src/main/java/com/cdbd/hr/domain/att/Shift/Shift.java b/src/main/java/com/cdbd/hr/domain/att/Shift/Shift.java new file mode 100644 index 0000000..b385a4f --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/att/Shift/Shift.java @@ -0,0 +1,21 @@ +package com.cdbd.hr.domain.att.Shift; + +import java.sql.Timestamp; + +import com.cdbd.hr.domain.common.DomainEntity; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +@DomainEntity +public class Shift { + + private String shiftId; + private String shiftName; + private String baseDay; + private String useYn; + private Timestamp createdAt; + private Timestamp updatedAt; +} diff --git a/src/main/java/com/cdbd/hr/domain/att/TaskAdjustment.java b/src/main/java/com/cdbd/hr/domain/att/TaskAdjustment.java new file mode 100644 index 0000000..7eb7757 --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/att/TaskAdjustment.java @@ -0,0 +1,23 @@ +package com.cdbd.hr.domain.att; + +import java.sql.Timestamp; + +import com.cdbd.hr.domain.common.DomainEntity; +import com.cdbd.hr.domain.emp.IDTypes.EmpId; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +@DomainEntity +public class TaskAdjustment { + + private EmpId empId; + private String adjType; + private String stdYmd; + private String startHms; + private String endHms; + private Timestamp createdAt; + private Timestamp updatedAt; +} diff --git a/src/main/java/com/cdbd/hr/domain/dep/IDTypes/DepCode.java b/src/main/java/com/cdbd/hr/domain/dep/IDTypes/DepCode.java new file mode 100644 index 0000000..50fcf37 --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/dep/IDTypes/DepCode.java @@ -0,0 +1,22 @@ +package com.cdbd.hr.domain.dep.IDTypes; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class DepCode { + + private String depCode; + + + public static DepCode valueOf(String value) { + return new DepCode(value); + } + +} + + + + + \ No newline at end of file diff --git a/src/main/java/com/cdbd/hr/domain/dep/convert/impl/JpaDepConverter.java b/src/main/java/com/cdbd/hr/domain/dep/convert/impl/JpaDepConverter.java new file mode 100644 index 0000000..56fe364 --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/dep/convert/impl/JpaDepConverter.java @@ -0,0 +1,38 @@ +package com.cdbd.hr.domain.dep.convert.impl; + +import java.time.Instant; +import java.util.Optional; + +import com.cdbd.hr.domain.dep.DepFactory; +import com.cdbd.hr.domain.dep.Department; +import com.cdbd.hr.domain.dep.IDTypes.DepCode; +import com.cdbd.hr.domain.dep.convert.DepConverter; +import com.cdbd.hr.infrastructure.jpa.entity.DepJpaEntity; + +public class JpaDepConverter implements DepConverter{ + + private final DepFactory factory = new DepFactory(); + + @Override + public Department convert(DepJpaEntity depEntity) { + return convert(depEntity, null); + } + + @Override + public Department convert(DepJpaEntity entity, Object object) { + + Department obj = this.factory.getInstance(); + + obj.setDepCode(DepCode.valueOf(Optional.ofNullable(entity.getDepCode()).orElse(null))); + obj.setDepName(String.valueOf(entity.getDepName())); + obj.setPDepCode(Optional.ofNullable(entity.getPDepCode()).orElse(null)); + obj.setCDepCode(Optional.ofNullable(entity.getCDepCode()).orElse(null)); + obj.setTDepYn(Optional.ofNullable(entity.getTDepYn()).orElse("N")); + obj.setStaYmd(Optional.ofNullable(entity.getStaYmd()).orElse(null)); + obj.setEndYmd(Optional.ofNullable(entity.getEndYmd()).orElse(null)); + obj.setCreatedAt(Optional.ofNullable(entity.getCreatedAt().toInstant()).orElse(Instant.now())); + obj.setUpdatedAt(Optional.ofNullable(entity.getUpdatedAt().toInstant()).orElse(Instant.now())); + + return obj; + } +} diff --git a/src/main/java/com/cdbd/hr/domain/emp/EmpDep/EmpDep.java b/src/main/java/com/cdbd/hr/domain/emp/EmpDep/EmpDep.java new file mode 100644 index 0000000..89144ee --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/emp/EmpDep/EmpDep.java @@ -0,0 +1,26 @@ +package com.cdbd.hr.domain.emp.EmpDep; + +import java.sql.Timestamp; + +import com.cdbd.hr.domain.common.DomainEntity; +import com.cdbd.hr.domain.dep.Department; +import com.cdbd.hr.domain.emp.IDTypes.EmpId; + +import lombok.Data; +import lombok.RequiredArgsConstructor; + +@Data +@RequiredArgsConstructor +@DomainEntity +public class EmpDep { + + private EmpId empId; + private Department depCode; + private String depLeaderYn; + private String dualDepYn; + private String staYmd; + private String endYmd; + private Timestamp createdAt; + private Timestamp updatedAt; + +} diff --git a/src/main/java/com/cdbd/hr/domain/emp/EmpFactory.java b/src/main/java/com/cdbd/hr/domain/emp/EmpFactory.java new file mode 100644 index 0000000..9b21cba --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/emp/EmpFactory.java @@ -0,0 +1,5 @@ +package com.cdbd.hr.domain.emp; + +public class EmpFactory { + public Employee getInstance() { return new Employee(); } +} diff --git a/src/main/java/com/cdbd/hr/domain/emp/convert/EmpConverter.java b/src/main/java/com/cdbd/hr/domain/emp/convert/EmpConverter.java new file mode 100644 index 0000000..9f7bd15 --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/emp/convert/EmpConverter.java @@ -0,0 +1,8 @@ +package com.cdbd.hr.domain.emp.convert; + +import com.cdbd.hr.domain.common.DomainConverter; +import com.cdbd.hr.domain.emp.Employee; + +public interface EmpConverter extends DomainConverter { + Employee convert(T entity, Object obj); +} diff --git a/src/main/java/com/cdbd/hr/domain/emp/convert/impl/JpaEmpConverter.java b/src/main/java/com/cdbd/hr/domain/emp/convert/impl/JpaEmpConverter.java new file mode 100644 index 0000000..1955d20 --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/emp/convert/impl/JpaEmpConverter.java @@ -0,0 +1,52 @@ +package com.cdbd.hr.domain.emp.convert.impl; + +import java.time.Instant; +import java.util.Optional; + +import com.cdbd.hr.domain.att.IDTypes.ShiftId; +import com.cdbd.hr.domain.emp.EmpFactory; +import com.cdbd.hr.domain.emp.Employee; +import com.cdbd.hr.domain.emp.IDTypes.EmpId; +import com.cdbd.hr.domain.emp.convert.EmpConverter; +import com.cdbd.hr.infrastructure.jpa.entity.EmpIdJpaEntity; +import com.cdbd.hr.infrastructure.jpa.entity.EmpJpaEntity; + +public class JpaEmpConverter implements EmpConverter { + + private final EmpFactory factory = new EmpFactory(); + + @Override + public Employee convert(EmpJpaEntity empEntity) { + return convert(empEntity, null); + } + + @Override + public Employee convert(EmpJpaEntity empEntity, Object object) { + EmpIdJpaEntity empIdEntity = (object instanceof EmpIdJpaEntity) ? (EmpIdJpaEntity) object : new EmpIdJpaEntity(); + + Employee obj = this.factory.getInstance(); + + obj.setEmpId(EmpId.valueOf(Optional.ofNullable(empEntity.getEmpId()).orElse(null))); + obj.setUseYn(Optional.ofNullable(empIdEntity.getUseYn()).orElse("N")); + obj.setShiftId(ShiftId.valueOf(Optional.ofNullable(empEntity.getShiftId()).orElse(null))); + obj.setName(Optional.ofNullable(empEntity.getName()).orElse(null)); + obj.setSsn(Optional.ofNullable(empEntity.getSsn()).orElse(null)); + obj.setNationality(Optional.ofNullable(empEntity.getNationality()).orElse(null)); + obj.setGender(Optional.ofNullable(empEntity.getGender()).orElse(null)); + obj.setPhoneNumber(Optional.ofNullable(empEntity.getPhoneNumber()).orElse(null)); + obj.setAddress(Optional.ofNullable(empEntity.getAddress()).orElse(null)); + obj.setJoinDate(Optional.ofNullable(empEntity.getJoinDate()).orElse(null)); + obj.setResignationDate(Optional.ofNullable(empEntity.getResignationDate()).orElse(null)); + obj.setPosition(Optional.ofNullable(empEntity.getPosition()).orElse(null)); + obj.setJobTitle(Optional.ofNullable(empEntity.getJobTitle()).orElse(null)); + obj.setEmpType(Optional.ofNullable(empEntity.getEmpType()).orElse(null)); + obj.setWorkLoc(Optional.ofNullable(empEntity.getWorkLoc()).orElse(null)); + obj.setSalary(Optional.ofNullable(empEntity.getSalary()).orElse(0)); + obj.setBank(Optional.ofNullable(empEntity.getBank()).orElse(null)); + obj.setBankAccount(Optional.ofNullable(empEntity.getBankAccount()).orElse(null)); + obj.setCreatedAt(Optional.ofNullable(empEntity.getCreatedAt().toInstant()).orElse(Instant.now())); + obj.setUpdatedAt(Optional.ofNullable(empEntity.getUpdatedAt().toInstant()).orElse(Instant.now())); + + return obj; + } +} From b034df604da7adfec52693f82809adc524eeddc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8F=99=EC=9A=B1=5Cdongw?= Date: Thu, 20 Mar 2025 20:53:29 +0900 Subject: [PATCH 2/4] =?UTF-8?q?entity=20=EA=B5=AC=EC=A1=B0=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=EC=99=80=20Repository?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jpa/entity/TaskAdjJpaEntity.java | 1 + .../jpa/repository/AttJpaRepository.java | 9 +++++++-- .../jpa/repository/DepJpaRepository.java | 11 +++++++++- .../jpa/repository/EmpDepJpaRepository.java | 12 ++++++++++- .../jpa/repository/EmpIdJpaRepository.java | 6 +++++- .../jpa/repository/EmpJpaRepository.java | 7 ++++++- .../jpa/repository/LeaveMngJpaRepository.java | 4 +++- .../LeaveUsageJpaHisRepository.java | 4 +++- .../jpa/repository/ShiftJpaRepository.java | 11 +++++++++- .../jpa/repository/TaskAdjJpaRepository.java | 8 +++++++- .../jpa/AttJpaRepositoryTest.java | 14 +++++++------ .../jpa/DepJpaRepositoryTest.java | 18 +++++++++-------- .../jpa/EmpDepJpaRepositoryTest.java | 20 ++++++++++--------- .../jpa/EmpIdJpaRepositoryTest.java | 16 ++++++++------- .../jpa/EmpJpaRepositoryTest.java | 16 ++++++++------- .../jpa/LeaveMngJpaRepositoryTest.java | 14 +++++++------ .../jpa/LeaveUsageJpaHisRepositoryTest.java | 14 +++++++------ .../jpa/ShiftJpaRepositoryTest.java | 20 ++++++++++--------- .../jpa/TaskAdjJpaRepositoryTest.java | 16 ++++++++------- 19 files changed, 146 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/TaskAdjJpaEntity.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/TaskAdjJpaEntity.java index 5bb0523..3825b53 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/TaskAdjJpaEntity.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/TaskAdjJpaEntity.java @@ -50,4 +50,5 @@ public class TaskAdjJpaEntity { @Column(name = "updated_at", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") @Comment("수정일시") private Timestamp updatedAt; + } diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/AttJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/AttJpaRepository.java index ceb5360..0c98eca 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/AttJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/AttJpaRepository.java @@ -1,5 +1,7 @@ package com.cdbd.hr.infrastructure.jpa.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -7,9 +9,12 @@ @Repository public interface AttJpaRepository extends JpaRepository { - + + //사번을 기준으로 조회 + Optional findByEmpId(String empId); + //사번과 기준일을 기준으로 조회 - AttJpaEntity findByEmpIdAndStdYmd(String empId, String stdYmd); + Optional findByEmpIdAndStdYmd(String empId, String stdYmd); //사번과 기준일을 기준으로 삭제 void deleteByEmpIdAndStdYmd(String empId, String stdYmd); diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/DepJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/DepJpaRepository.java index 97b17a2..3b6444b 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/DepJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/DepJpaRepository.java @@ -1,10 +1,19 @@ package com.cdbd.hr.infrastructure.jpa.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.cdbd.hr.infrastructure.jpa.entity.DepJpaEntity; @Repository -public interface DepJpaRepository extends JpaRepository {} +public interface DepJpaRepository extends JpaRepository { + + //부서ID를 기준으로 조회 + Optional findByDepId(String depId); + + //부서ID를 기준으로 삭제 + void deleteByDepId(String depId); +} diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpDepJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpDepJpaRepository.java index fc8609b..6533ea1 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpDepJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpDepJpaRepository.java @@ -1,9 +1,19 @@ package com.cdbd.hr.infrastructure.jpa.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.cdbd.hr.infrastructure.jpa.entity.EmpDepJpaEntity; @Repository -public interface EmpDepJpaRepository extends JpaRepository {} \ No newline at end of file +public interface EmpDepJpaRepository extends JpaRepository { + + //사번을 기준으로 조회 + Optional findByEmpIdAndDepId(String empId); + + //사번과 부서 ID를 기준으로 조회 + Optional findByEmpIdAndDepId(String empId, String depId); + +} \ No newline at end of file diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpIdJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpIdJpaRepository.java index db705b5..972f47c 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpIdJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpIdJpaRepository.java @@ -10,6 +10,10 @@ @Repository public interface EmpIdJpaRepository extends JpaRepository { - Optional findByEmpId(String empId); + //사번을 기준으로 조회 + Optional findByEmpId(String empI); + + //사번을 기준으로 삭제 + void deleteByEmpId(String empId); } diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpJpaRepository.java index 659ffb5..5d3eab7 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/EmpJpaRepository.java @@ -10,7 +10,12 @@ @Repository public interface EmpJpaRepository extends JpaRepository { - Optional findByEmpId(String empId); + //사번을 기준으로 조회 + Optional findByEmpId(String empI); + + //사번을 기준으로 삭제 + void deleteByEmpId(String empId); + } diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/LeaveMngJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/LeaveMngJpaRepository.java index 59ead98..1111855 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/LeaveMngJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/LeaveMngJpaRepository.java @@ -1,5 +1,7 @@ package com.cdbd.hr.infrastructure.jpa.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,7 +11,7 @@ public interface LeaveMngJpaRepository extends JpaRepository { //사번과 휴가유형을 기준으로 조회 - LeaveMngJpaEntity findByEmpIdAndLeaveType(String empId, String leaveType); + Optional findByEmpIdAndLeaveType(String empId, String leaveType); //사번과 휴가유형을 기준으로 삭제 void deleteByEmpIdAndLeaveType(String empId, String leaveType); diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/LeaveUsageJpaHisRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/LeaveUsageJpaHisRepository.java index 246686b..514bb95 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/LeaveUsageJpaHisRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/LeaveUsageJpaHisRepository.java @@ -1,5 +1,7 @@ package com.cdbd.hr.infrastructure.jpa.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,7 +11,7 @@ public interface LeaveUsageJpaHisRepository extends JpaRepository { //사번과 휴가유형, 기준일을 기준으로 조회 - LeaveUsageJpaHisEntity findByEmpIdAndLeaveTypeAndStdYmd(String empId, String leaveType, String stdYmd); + Optional findByEmpIdAndLeaveTypeAndStdYmd(String empId, String leaveType, String stdYmd); //사번과 휴가유형을 기준일을 기준으로 삭제 void deleteByEmpIdAndLeaveTypeAndStdYmd(String empId, String leaveType, String stdYmd); diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/ShiftJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/ShiftJpaRepository.java index 811f00a..1355903 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/ShiftJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/ShiftJpaRepository.java @@ -1,9 +1,18 @@ package com.cdbd.hr.infrastructure.jpa.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.cdbd.hr.infrastructure.jpa.entity.ShiftJpaEntity; @Repository -public interface ShiftJpaRepository extends JpaRepository {} +public interface ShiftJpaRepository extends JpaRepository { + + //근무조ID를 기준으로 조회 + Optional findByShiftId(String shiftId); + + //근무조ID를 기준으로 삭제 + void deleteByShiftId(String shiftId); +} diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/TaskAdjJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/TaskAdjJpaRepository.java index e813f8a..d482dca 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/TaskAdjJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/TaskAdjJpaRepository.java @@ -1,5 +1,7 @@ package com.cdbd.hr.infrastructure.jpa.repository; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,9 +10,13 @@ @Repository public interface TaskAdjJpaRepository extends JpaRepository { + //사번을 기준으로 조회 + Optional findByEmpId(String empId); + //사번과 기준일을 기준으로 조회 - TaskAdjJpaEntity findByEmpIdAndStdYmd(String empId, String stdYmd); + Optional findByEmpIdAndStdYmd(String empId, String stdYmd); //사번과 기준일을 기준으로 삭제 void deleteByEmpIdAndStdYmd(String empId, String stdYmd); + } diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/AttJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/AttJpaRepositoryTest.java index b9db2b3..14d21ca 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/AttJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/AttJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -70,16 +71,17 @@ public void setUp() { attJpaRepository.save(attJpaEntity); // when: 특정 empId와 stdYmd로 엔티티 조회 - AttJpaEntity foundEntity = attJpaRepository.findById("E001").orElse(null); + Optional foundEntity = attJpaRepository.findByEmpIdAndStdYmd("E001", "20241222"); // then: 조회된 엔티티 값 검증 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getEmpId()).isEqualTo("E001"); - assertThat(foundEntity.getStdYmd()).isEqualTo("20241222"); + AttJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 엔티티가 존재하지 않습니다.")); + assertThat(entity.getEmpId()).isEqualTo("E001"); + assertThat(entity.getStdYmd()).isEqualTo("20241222"); - logger.info("근태 조회 테스트 완료: {}", foundEntity); + logger.info("근태 조회 테스트 완료: {}", entity); } + @Test @Transactional public void 근태삭제하기() { @@ -90,7 +92,7 @@ public void setUp() { attJpaRepository.deleteByEmpIdAndStdYmd("E001", "20241222"); // then: 삭제 후 조회하여 null 반환되는지 검증 - AttJpaEntity foundEntity = attJpaRepository.findByEmpIdAndStdYmd("E001", "20241222"); + Optional foundEntity = attJpaRepository.findByEmpIdAndStdYmd("E001", "20241222"); assertThat(foundEntity).isNull(); logger.info("근태 삭제 테스트 완료. 삭제된 근태 : 사번(E001) 기준일(20241222)"); diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/DepJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/DepJpaRepositoryTest.java index af5b796..686f602 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/DepJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/DepJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -66,27 +67,28 @@ public void setUp() { depJpaRepository.save(depJpaEntity); // when: 특정 depCode로 엔티티를 조회 - DepJpaEntity foundEntity = depJpaRepository.findById("D001").orElse(null); + Optional foundEntity = depJpaRepository.findByDepId("D001"); // then: 조회된 엔티티의 값이 맞는지 확인 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getDepCode()).isEqualTo("D001"); - assertThat(foundEntity.getDepName()).isEqualTo("영업부"); - assertThat(foundEntity.getPDepCode()).isEqualTo("PD001"); + DepJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 부서가 존재하지 않습니다.")); + assertThat(entity.getDepCode()).isEqualTo("D001"); + assertThat(entity.getDepName()).isEqualTo("영업부"); + assertThat(entity.getPDepCode()).isEqualTo("PD001"); - logger.info("부서 조회 테스트 완료: {}", foundEntity); + logger.info("부서 조회 테스트 완료: {}", entity); } + @Test public void 부서삭제하기() { // given: Entity 저장 depJpaRepository.save(depJpaEntity); // when: 엔티티 삭제 - depJpaRepository.deleteById("D001"); + depJpaRepository.deleteByDepId("D001"); // then: 삭제 후 조회하여 null 반환되는지 확인 - DepJpaEntity foundEntity = depJpaRepository.findById("D001").orElse(null); + Optional foundEntity = depJpaRepository.findByDepId("D001"); assertThat(foundEntity).isNull(); logger.info("부서 삭제 테스트 완료. 삭제된 부서: D001"); diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpDepJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpDepJpaRepositoryTest.java index 6ce58e7..354ee08 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpDepJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpDepJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -80,28 +81,29 @@ public void setUp() { // given: 엔티티를 저장 empDepJpaRepository.save(empDepJpaEntity); - // when: empId로 엔티티 조회 - EmpDepJpaEntity foundEntity = empDepJpaRepository.findById("E001").orElse(null); + // when: empId와 depId로 엔티티 조회 + Optional foundEntity = empDepJpaRepository.findByEmpIdAndDepId("E001", "D001"); // then: 조회된 엔티티의 값 확인 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getEmpId()).isEqualTo("E001"); - assertThat(foundEntity.getDepCode().getDepCode()).isEqualTo("D001"); // 부서코드 확인 - assertThat(foundEntity.getDepLeaderYn()).isEqualTo("Y"); + EmpDepJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 사번-부서 관계가 존재하지 않습니다.")); + assertThat(entity.getEmpId()).isEqualTo("E001"); + assertThat(entity.getDepCode().getDepCode()).isEqualTo("D001"); // 부서코드 확인 + assertThat(entity.getDepLeaderYn()).isEqualTo("Y"); - logger.info("사번-부서 관계 조회 테스트 완료: {}", foundEntity); + logger.info("사번-부서 관계 조회 테스트 완료: {}", entity); } + @Test public void 사번_부서관계삭제하기() { // given: 엔티티 저장 empDepJpaRepository.save(empDepJpaEntity); // when: 엔티티 삭제 - empDepJpaRepository.deleteById("E001"); + empDepJpaRepository.findByEmpIdAndDepId("E001","D001"); // then: 삭제 후 조회하여 null인지 확인 - EmpDepJpaEntity foundEntity = empDepJpaRepository.findById("E001").orElse(null); + Optional foundEntity = empDepJpaRepository.findByEmpIdAndDepId("E001","D001"); assertThat(foundEntity).isNull(); logger.info("사번-부서 관계 삭제 테스트 완료. 삭제된 엔티티: {}", empDepJpaEntity); diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpIdJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpIdJpaRepositoryTest.java index 2bb9379..634e1ee 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpIdJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpIdJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -56,26 +57,27 @@ public void setUp() { empIdJpaRepository.save(empIdJpaEntity); // when: 특정 empId로 엔티티를 조회 - EmpIdJpaEntity foundEntity = empIdJpaRepository.findById("E001").orElse(null); + Optional foundEntity = empIdJpaRepository.findByEmpId("E001"); // then: 조회된 엔티티의 값이 맞는지 확인 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getEmpId()).isEqualTo("E001"); - assertThat(foundEntity.getUseYn()).isEqualTo("Y"); + EmpIdJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 사번이 존재하지 않습니다.")); + assertThat(entity.getEmpId()).isEqualTo("E001"); + assertThat(entity.getUseYn()).isEqualTo("Y"); - logger.info("사번 조회 테스트 완료: {}", foundEntity); + logger.info("사번 조회 테스트 완료: {}", entity); } + @Test public void 사번삭제하기() { // given: Entity 저장 empIdJpaRepository.save(empIdJpaEntity); // when: 엔티티 삭제 - empIdJpaRepository.deleteById("E001"); + empIdJpaRepository.deleteByEmpId("E001"); // then: 삭제 후 조회하여 null 반환되는지 확인 - EmpIdJpaEntity foundEntity = empIdJpaRepository.findById("E001").orElse(null); + Optional foundEntity = empIdJpaRepository.findByEmpId("E001"); assertThat(foundEntity).isNull(); logger.info("사번 삭제 테스트 완료. 삭제된 사번: E001"); diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpJpaRepositoryTest.java index 01b00d9..650f93d 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -70,26 +71,27 @@ public void setUp() { empJpaRepository.save(empJpaEntity); // when: 특정 empId로 엔티티를 조회 - EmpJpaEntity foundEntity = empJpaRepository.findById("E001").orElse(null); + Optional foundEntity = empJpaRepository.findByEmpId("E001"); // then: 조회된 엔티티의 값이 맞는지 확인 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getEmpId()).isEqualTo("E001"); - assertThat(foundEntity.getName()).isEqualTo("김철수"); + EmpJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 사원이 존재하지 않습니다.")); + assertThat(entity.getEmpId()).isEqualTo("E001"); + assertThat(entity.getName()).isEqualTo("김철수"); - logger.info("사원 조회 테스트 완료: {}", foundEntity); + logger.info("사원 조회 테스트 완료: {}", entity); } + @Test public void 사원삭제하기() { // given: Entity 저장 empJpaRepository.save(empJpaEntity); // when: 엔티티 삭제 - empJpaRepository.deleteById("E001"); + empJpaRepository.deleteByEmpId("E001"); // then: 삭제 후 조회하여 null 반환되는지 확인 - EmpJpaEntity foundEntity = empJpaRepository.findById("E001").orElse(null); + Optional foundEntity = empJpaRepository.findByEmpId("E001"); assertThat(foundEntity).isNull(); logger.info("사원 삭제 테스트 완료. 삭제된 사번: E001"); diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/LeaveMngJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/LeaveMngJpaRepositoryTest.java index 964d05d..31b928e 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/LeaveMngJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/LeaveMngJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -66,16 +67,17 @@ public void setUp() { leaveMngJpaRepository.save(leaveMngJpaEntity); // when: 특정 leaveType으로 엔티티 조회 - LeaveMngJpaEntity foundEntity = leaveMngJpaRepository.findByEmpIdAndLeaveType("E001", "연차휴가"); + Optional foundEntity = leaveMngJpaRepository.findByEmpIdAndLeaveType("E001", "연차휴가"); // then: 조회된 엔티티 값 확인 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getLeaveType()).isEqualTo("연차휴가"); - assertThat(foundEntity.getEmpId()).isEqualTo("E001"); + LeaveMngJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 연차 데이터가 존재하지 않습니다.")); + assertThat(entity.getLeaveType()).isEqualTo("연차휴가"); + assertThat(entity.getEmpId()).isEqualTo("E001"); - logger.info("연차 조회 테스트 완료: {}", foundEntity); + logger.info("연차 조회 테스트 완료: {}", entity); } + @Test @Transactional public void 연차삭제하기() { @@ -86,7 +88,7 @@ public void setUp() { leaveMngJpaRepository.deleteByEmpIdAndLeaveType("E001", "연차휴가"); // then: 삭제 후 조회하여 null 반환되는지 검증 - LeaveMngJpaEntity foundEntity = leaveMngJpaRepository.findByEmpIdAndLeaveType("E001", "연차휴가"); + Optional foundEntity = leaveMngJpaRepository.findByEmpIdAndLeaveType("E001", "연차휴가"); assertThat(foundEntity).isNull(); logger.info("연차 삭제 테스트 완료. 삭제된 연차: annual"); diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/LeaveUsageJpaHisRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/LeaveUsageJpaHisRepositoryTest.java index 6ad0fb8..832b5a5 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/LeaveUsageJpaHisRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/LeaveUsageJpaHisRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -64,16 +65,17 @@ public void setUp() { leaveUsageJpaHisRepository.save(leaveUsageJpaHisEntity); // when: 데이터 조회 - LeaveUsageJpaHisEntity foundEntity = leaveUsageJpaHisRepository.findById("E001").orElse(null); + Optional foundEntity = leaveUsageJpaHisRepository.findByEmpIdAndLeaveTypeAndStdYmd("E001", "연차휴가", "20240115"); // then: 조회된 엔티티 값 검증 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getEmpId()).isEqualTo("E001"); - assertThat(foundEntity.getLeaveType()).isEqualTo("연차휴가"); + LeaveUsageJpaHisEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 연차 사용 내역이 존재하지 않습니다.")); + assertThat(entity.getEmpId()).isEqualTo("E001"); + assertThat(entity.getLeaveType()).isEqualTo("연차휴가"); - logger.info("연차 사용 내역 조회 테스트 완료: {}", foundEntity); + logger.info("연차 사용 내역 조회 테스트 완료: {}", entity); } + @Test @Transactional public void 연차사용내역삭제하기() { @@ -84,7 +86,7 @@ public void setUp() { leaveUsageJpaHisRepository.deleteByEmpIdAndLeaveTypeAndStdYmd("E001","연차휴가","20240115"); // then: 삭제 후 데이터 조회 - LeaveUsageJpaHisEntity foundEntity = leaveUsageJpaHisRepository.findByEmpIdAndLeaveTypeAndStdYmd("E001","연차휴가","20240115"); + Optional foundEntity = leaveUsageJpaHisRepository.findByEmpIdAndLeaveTypeAndStdYmd("E001","연차휴가","20240115"); assertThat(foundEntity).isNull(); logger.info("연차 사용 내역 삭제 테스트 완료. 삭제된 사번: E001"); diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/ShiftJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/ShiftJpaRepositoryTest.java index 418a3da..8b78e09 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/ShiftJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/ShiftJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -60,28 +61,29 @@ public void setUp() { shiftJpaRepository.save(shiftJpaEntity); // when: ID를 기준으로 데이터 조회 - ShiftJpaEntity foundEntity = shiftJpaRepository.findById("S001").orElse(null); + Optional foundEntity = shiftJpaRepository.findByShiftId("S001"); // then: 조회된 값 검증 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getShiftId()).isEqualTo("S001"); - assertThat(foundEntity.getShiftName()).isEqualTo("사무직"); - assertThat(foundEntity.getBaseDay()).isEqualTo("월요일"); - assertThat(foundEntity.getUseYn()).isEqualTo("Y"); + ShiftJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 근무조가 존재하지 않습니다.")); + assertThat(entity.getShiftId()).isEqualTo("S001"); + assertThat(entity.getShiftName()).isEqualTo("사무직"); + assertThat(entity.getBaseDay()).isEqualTo("월요일"); + assertThat(entity.getUseYn()).isEqualTo("Y"); - logger.info("근무조 조회 테스트 완료: {}", foundEntity); + logger.info("근무조 조회 테스트 완료: {}", entity); } + @Test public void 근무조삭제하기() { // given: Entity 저장 shiftJpaRepository.save(shiftJpaEntity); // when: 데이터 삭제 - shiftJpaRepository.deleteById("S001"); + shiftJpaRepository.deleteByShiftId("S001"); // then: 삭제 확인 - ShiftJpaEntity foundEntity = shiftJpaRepository.findById("S001").orElse(null); + Optional foundEntity = shiftJpaRepository.findByShiftId("S001"); assertThat(foundEntity).isNull(); logger.info("근무조 삭제 테스트 완료. 삭제된 근무조 ID: S001"); diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/TaskAdjJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/TaskAdjJpaRepositoryTest.java index 60ed8bc..3bf96dd 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/TaskAdjJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/TaskAdjJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -64,17 +65,18 @@ public void setUp() { taskAdjJpaRepository.save(taskAdjJpaEntity); // when: 데이터 조회 - TaskAdjJpaEntity foundEntity = taskAdjJpaRepository.findById("E001").orElse(null); + Optional foundEntity = taskAdjJpaRepository.findByEmpIdAndStdYmd("E001", "20241226"); // then: 조회된 데이터 검증 - assertThat(foundEntity).isNotNull(); - assertThat(foundEntity.getEmpId()).isEqualTo("E001"); - assertThat(foundEntity.getAdjType()).isEqualTo("출장"); - assertThat(foundEntity.getStdYmd()).isEqualTo("20241226"); + TaskAdjJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 업무 가감 데이터가 존재하지 않습니다.")); + assertThat(entity.getEmpId()).isEqualTo("E001"); + assertThat(entity.getAdjType()).isEqualTo("출장"); + assertThat(entity.getStdYmd()).isEqualTo("20241226"); - logger.info("업무 가감 조회 테스트 완료: {}", foundEntity); + logger.info("업무 가감 조회 테스트 완료: {}", entity); } + @Test @Transactional public void 업무가감삭제하기() { @@ -85,7 +87,7 @@ public void setUp() { taskAdjJpaRepository.deleteByEmpIdAndStdYmd("E001", "20241226"); // then: 삭제 후 조회하여 null 반환되는지 검증 - TaskAdjJpaEntity foundEntity = taskAdjJpaRepository.findByEmpIdAndStdYmd("E001", "20241226"); + Optional foundEntity = taskAdjJpaRepository.findByEmpIdAndStdYmd("E001", "20241226"); assertThat(foundEntity).isNull(); From a3e87b89cd7a20050b62f0187caa45e3e73dee4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8F=99=EC=9A=B1=5Cdongw?= Date: Thu, 27 Mar 2025 22:50:05 +0900 Subject: [PATCH 3/4] =?UTF-8?q?add=20:=20=EB=B6=80=EC=84=9C=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EA=B0=9C=EB=B0=9C=20#3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/cdbd/hr/domain/dep/DepRepository.java | 10 +- ...Converter.java => DepDomainConverter.java} | 0 .../repository/impl/DepDomainRepository.java | 100 ++++++++++++++++++ .../dep/repository/impl/JpaDepRepository.java | 76 ------------- 4 files changed, 106 insertions(+), 80 deletions(-) rename src/main/java/com/cdbd/hr/domain/dep/convert/impl/{JpaDepConverter.java => DepDomainConverter.java} (100%) create mode 100644 src/main/java/com/cdbd/hr/domain/dep/repository/impl/DepDomainRepository.java delete mode 100644 src/main/java/com/cdbd/hr/domain/dep/repository/impl/JpaDepRepository.java diff --git a/src/main/java/com/cdbd/hr/domain/dep/DepRepository.java b/src/main/java/com/cdbd/hr/domain/dep/DepRepository.java index 5c40ae8..fddb062 100644 --- a/src/main/java/com/cdbd/hr/domain/dep/DepRepository.java +++ b/src/main/java/com/cdbd/hr/domain/dep/DepRepository.java @@ -2,14 +2,16 @@ import java.util.List; +import com.cdbd.hr.domain.dep.IDTypes.DepCode; + public interface DepRepository { void save(Department board); - void update(Department board); - - void delete(String boardId); + void delete(DepCode depCode); List getAllDepartment(); - List findAllByOrderByDepCodeAsc(); + Department findByDepCode(DepCode depCode); + + Department findByDepName(String depNamde); } diff --git a/src/main/java/com/cdbd/hr/domain/dep/convert/impl/JpaDepConverter.java b/src/main/java/com/cdbd/hr/domain/dep/convert/impl/DepDomainConverter.java similarity index 100% rename from src/main/java/com/cdbd/hr/domain/dep/convert/impl/JpaDepConverter.java rename to src/main/java/com/cdbd/hr/domain/dep/convert/impl/DepDomainConverter.java diff --git a/src/main/java/com/cdbd/hr/domain/dep/repository/impl/DepDomainRepository.java b/src/main/java/com/cdbd/hr/domain/dep/repository/impl/DepDomainRepository.java new file mode 100644 index 0000000..de159b8 --- /dev/null +++ b/src/main/java/com/cdbd/hr/domain/dep/repository/impl/DepDomainRepository.java @@ -0,0 +1,100 @@ +package com.cdbd.hr.domain.dep.repository.impl; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +import org.springframework.util.Assert; + +import com.cdbd.hr.domain.dep.DepRepository; +import com.cdbd.hr.domain.dep.Department; +import com.cdbd.hr.domain.dep.IDTypes.DepCode; +import com.cdbd.hr.infrastructure.jpa.entity.DepJpaEntity; +import com.cdbd.hr.infrastructure.jpa.repository.DepJpaRepository; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +public class DepDomainRepository implements DepRepository{ + + private final DepJpaRepository jpaRepository; + + @Override + public void save(Department department) + { + Assert.notNull(department, "회원 엔티티는 Null일 수 없습니다."); + System.out.println("JpaDepRepository의 insert까지는 탐" + department); + this.jpaRepository.save(JpaConverter(department)); + } + + @Override + public void delete(DepCode depCode) + { + this.jpaRepository.deleteByDepCode(String.valueOf(depCode)); + } + + @Override + public List getAllDepartment() + { + return this.jpaRepository.findAll().stream() + .map(this::domainconverter) + .toList(); + } + + @Override + public Department findByDepCode(DepCode depCode) + { + return this.domainconverter(this.jpaRepository.findByDepCode(String.valueOf(depCode)).orElse(null)); + } + + + @Override + public Department findByDepName(String depName) + { + return this.domainconverter(this.jpaRepository.findByDepName(depName).orElse(null)); + } + + private DepJpaEntity JpaConverter(Department data) { + DepJpaEntity obj = new DepJpaEntity(); + + obj.setDepCode(String.valueOf(Optional.ofNullable(data.getDepCode()).orElse(null))); + obj.setPDepCode(Optional.ofNullable(data.getPDepCode()).orElse(null)); + obj.setCDepCode(Optional.ofNullable(data.getCDepCode()).orElse(null)); + obj.setTDepYn(Optional.ofNullable(data.getTDepYn()).orElse("N")); + obj.setStaYmd(Optional.ofNullable(data.getStaYmd()).orElse(null)); + obj.setEndYmd(Optional.ofNullable(data.getEndYmd()).orElse(null)); + obj.setCreatedAt(Optional.ofNullable(data.getCreatedAt()) + .map(instant -> instant.atZone(java.time.ZoneId.systemDefault()).toLocalDateTime()) + .orElse(LocalDateTime.now())); + obj.setUpdatedAt(Optional.ofNullable(data.getUpdatedAt()) + .map(instant -> instant.atZone(java.time.ZoneId.systemDefault()).toLocalDateTime()) + .orElse(LocalDateTime.now())); + + return obj; + } + + + public Department domainconverter(DepJpaEntity entity) { + Department obj = new Department(); + + obj.setDepCode(DepCode.valueOf(Optional.ofNullable(entity.getDepCode()).orElse(null))); + obj.setDepName(String.valueOf(entity.getDepName())); + obj.setPDepCode(Optional.ofNullable(entity.getPDepCode()).orElse(null)); + obj.setCDepCode(Optional.ofNullable(entity.getCDepCode()).orElse(null)); + obj.setTDepYn(Optional.ofNullable(entity.getTDepYn()).orElse("N")); + obj.setStaYmd(Optional.ofNullable(entity.getStaYmd()).orElse(null)); + obj.setEndYmd(Optional.ofNullable(entity.getEndYmd()).orElse(null)); + obj.setCreatedAt(Optional.ofNullable(entity.getCreatedAt()) + .map(date -> date.atZone(java.time.ZoneId.systemDefault()).toInstant()) + .orElse(Instant.now())); + obj.setUpdatedAt(Optional.ofNullable(entity.getUpdatedAt()) + .map(date -> date.atZone(java.time.ZoneId.systemDefault()).toInstant()) + .orElse(Instant.now())); + + return obj; + } + +} diff --git a/src/main/java/com/cdbd/hr/domain/dep/repository/impl/JpaDepRepository.java b/src/main/java/com/cdbd/hr/domain/dep/repository/impl/JpaDepRepository.java deleted file mode 100644 index 234721e..0000000 --- a/src/main/java/com/cdbd/hr/domain/dep/repository/impl/JpaDepRepository.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.cdbd.hr.domain.dep.repository.impl; - -import java.sql.Timestamp; -import java.time.Instant; -import java.util.List; -import java.util.Optional; - -import org.springframework.util.Assert; - -import com.cdbd.hr.domain.dep.DepRepository; -import com.cdbd.hr.domain.dep.Department; -import com.cdbd.hr.domain.dep.convert.DepConverter; -import com.cdbd.hr.infrastructure.jpa.entity.DepJpaEntity; -import com.cdbd.hr.infrastructure.jpa.repository.DepJpaRepository; - -public class JpaDepRepository implements DepRepository{ - - private final DepJpaRepository jpaRepository; - private final DepConverter converter; - - public JpaDepRepository(DepJpaRepository jpaRepository, DepConverter converter) { - Assert.notNull(jpaRepository, "jpaRepository는 null일 수 없습니다."); - Assert.notNull(converter, "converter는 null일 수 없습니다."); - this.jpaRepository = jpaRepository; - this.converter = converter; - } - - @Override - public void save(Department department) - { - Assert.notNull(department, "회원 엔티티는 Null일 수 없습니다."); - System.out.println("JpaDepRepository의 insert까지는 탐" + department); - this.jpaRepository.save(convert(department)); - } - - @Override - public void update(Department department) - { - - } - - @Override - public void delete(String boardId) - { - - } - - @Override - public List getAllDepartment() - { - return null; - } - - - @Override - public List findAllByOrderByDepCodeAsc() - { - return null; - } - - private DepJpaEntity convert(Department data) { - DepJpaEntity obj = new DepJpaEntity(); - - obj.setDepCode(String.valueOf(Optional.ofNullable(data.getDepCode()).orElse(null))); - obj.setPDepCode(Optional.ofNullable(data.getPDepCode()).orElse(null)); - obj.setCDepCode(Optional.ofNullable(data.getCDepCode()).orElse(null)); - obj.setTDepYn(Optional.ofNullable(data.getTDepYn()).orElse("N")); - obj.setStaYmd(Optional.ofNullable(data.getStaYmd()).orElse(null)); - obj.setEndYmd(Optional.ofNullable(data.getEndYmd()).orElse(null)); - obj.setCreatedAt(Timestamp.from(Instant.now())); - obj.setUpdatedAt(Timestamp.from(Instant.now())); - - return obj; - } - -} From c76953b6f43026c998a9b77c9604b57448ce7671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=8F=99=EC=9A=B1=5Cdongw?= Date: Fri, 4 Apr 2025 00:32:44 +0900 Subject: [PATCH 4/4] =?UTF-8?q?add=20:=20=EB=B6=80=EC=84=9C=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EA=B0=9C=EB=B0=9C=20#4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 41 ++--- .../config/dep/obj/DepDataObject.java | 21 +++ .../com/cdbd/hr/domain/dep/DepRepository.java | 5 +- .../com/cdbd/hr/domain/dep/Department.java | 35 +++- .../hr/domain/dep/convert/DepConverter.java | 8 - .../dep/convert/impl/DepDomainConverter.java | 38 ----- .../repository/impl/DepDomainRepository.java | 10 +- .../jpa/entity/DepJpaEntity.java | 18 +-- .../jpa/entity/EmpDepJpaEntity.java | 2 - .../jpa/entity/EmpJpaEntity.java | 2 - .../jpa/repository/DepJpaRepository.java | 4 +- .../hr/domain/dep/DepartmentUnitTest.java | 150 ++++++++++++++++++ .../jpa/DepJpaRepositoryTest.java | 43 +++-- .../jpa/EmpDepJpaRepositoryTest.java | 5 +- 14 files changed, 263 insertions(+), 119 deletions(-) create mode 100644 src/main/java/com/cdbd/hr/applicatijon/config/dep/obj/DepDataObject.java delete mode 100644 src/main/java/com/cdbd/hr/domain/dep/convert/DepConverter.java delete mode 100644 src/main/java/com/cdbd/hr/domain/dep/convert/impl/DepDomainConverter.java create mode 100644 src/test/java/com/cdbd/hr/domain/dep/DepartmentUnitTest.java diff --git a/build.gradle b/build.gradle index 4fd7d38..b591541 100644 --- a/build.gradle +++ b/build.gradle @@ -1,38 +1,41 @@ plugins { - id 'java' - id 'org.springframework.boot' version '3.3.4' - id 'io.spring.dependency-management' version '1.1.6' + id 'java' + id 'org.springframework.boot' version '3.3.10' + id 'io.spring.dependency-management' version '1.1.6' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } } repositories { - mavenCentral() + mavenCentral() } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' - implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' - compileOnly 'org.projectlombok:lombok' - developmentOnly 'org.springframework.boot:spring-boot-devtools' - runtimeOnly 'org.postgresql:postgresql' - runtimeOnly 'com.h2database:h2' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' compileOnly 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + runtimeOnly 'org.postgresql:postgresql' + runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.projectlombok:lombok' // 테스트를 위한 세팅 - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.junit.jupiter:junit-jupiter:5.9.3' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.junit.jupiter:junit-jupiter:5.9.3' } tasks.named('test') { - useJUnitPlatform() + useJUnitPlatform() + jvmArgs "-Xshare:off" +} + +tasks.withType(JavaCompile).configureEach { + options.compilerArgs.add("-Xlint:-options") } diff --git a/src/main/java/com/cdbd/hr/applicatijon/config/dep/obj/DepDataObject.java b/src/main/java/com/cdbd/hr/applicatijon/config/dep/obj/DepDataObject.java new file mode 100644 index 0000000..8852e73 --- /dev/null +++ b/src/main/java/com/cdbd/hr/applicatijon/config/dep/obj/DepDataObject.java @@ -0,0 +1,21 @@ +package com.cdbd.hr.applicatijon.config.dep.obj; + +import java.time.Instant; + +import com.cdbd.hr.domain.dep.IDTypes.DepCode; + +import lombok.Data; + +@Data +public class DepDataObject { + + private DepCode depCode; + private String depName; + private String pDepCode; + private String cDepCode; + private String tDepYn; + private String staYmd; + private String endYmd; + private Instant createdAt; + private Instant updatedAt; +} diff --git a/src/main/java/com/cdbd/hr/domain/dep/DepRepository.java b/src/main/java/com/cdbd/hr/domain/dep/DepRepository.java index fddb062..18b6503 100644 --- a/src/main/java/com/cdbd/hr/domain/dep/DepRepository.java +++ b/src/main/java/com/cdbd/hr/domain/dep/DepRepository.java @@ -11,7 +11,6 @@ public interface DepRepository { List getAllDepartment(); - Department findByDepCode(DepCode depCode); - - Department findByDepName(String depNamde); + Department findByDepCodeIgnoreCase(DepCode depCode); + } diff --git a/src/main/java/com/cdbd/hr/domain/dep/Department.java b/src/main/java/com/cdbd/hr/domain/dep/Department.java index 9abb5a3..94c84d6 100644 --- a/src/main/java/com/cdbd/hr/domain/dep/Department.java +++ b/src/main/java/com/cdbd/hr/domain/dep/Department.java @@ -1,9 +1,11 @@ package com.cdbd.hr.domain.dep; import java.time.Instant; +import java.util.List; import com.cdbd.hr.domain.common.DomainEntity; import com.cdbd.hr.domain.dep.IDTypes.DepCode; +import com.cdbd.hr.domain.dep.repository.impl.DepDomainRepository; import lombok.Data; @@ -21,5 +23,36 @@ public class Department { private Instant createdAt; private Instant updatedAt; - + + // 저장,수정 + public void save(DepDomainRepository repository) { + repository.save(this); + } + + // 삭제 + public void delete(DepDomainRepository repository){ + repository.delete(this.depCode); + } + + // 전체 부서 조회 + public List getDepartmentList(DepDomainRepository repository) { + return repository.getAllDepartment(); + } + + // 부서 코드로 조회 + public Department findByDepCode(DepDomainRepository repository) { + Department data = repository.findByDepCodeIgnoreCase(this.depCode); + setDepCode(data.getDepCode()); + setDepName(data.getDepName()); + setPDepCode(data.getPDepCode()); + setCDepCode(data.getCDepCode()); + setTDepYn(data.getTDepYn()); + setStaYmd(data.getStaYmd()); + setEndYmd(data.getEndYmd()); + setCreatedAt(data.getCreatedAt()); + setUpdatedAt(data.getUpdatedAt()); + + return this; + } + } diff --git a/src/main/java/com/cdbd/hr/domain/dep/convert/DepConverter.java b/src/main/java/com/cdbd/hr/domain/dep/convert/DepConverter.java deleted file mode 100644 index 45da019..0000000 --- a/src/main/java/com/cdbd/hr/domain/dep/convert/DepConverter.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.cdbd.hr.domain.dep.convert; - -import com.cdbd.hr.domain.common.DomainConverter; -import com.cdbd.hr.domain.dep.Department; - -public interface DepConverter extends DomainConverter { - -} diff --git a/src/main/java/com/cdbd/hr/domain/dep/convert/impl/DepDomainConverter.java b/src/main/java/com/cdbd/hr/domain/dep/convert/impl/DepDomainConverter.java deleted file mode 100644 index 56fe364..0000000 --- a/src/main/java/com/cdbd/hr/domain/dep/convert/impl/DepDomainConverter.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.cdbd.hr.domain.dep.convert.impl; - -import java.time.Instant; -import java.util.Optional; - -import com.cdbd.hr.domain.dep.DepFactory; -import com.cdbd.hr.domain.dep.Department; -import com.cdbd.hr.domain.dep.IDTypes.DepCode; -import com.cdbd.hr.domain.dep.convert.DepConverter; -import com.cdbd.hr.infrastructure.jpa.entity.DepJpaEntity; - -public class JpaDepConverter implements DepConverter{ - - private final DepFactory factory = new DepFactory(); - - @Override - public Department convert(DepJpaEntity depEntity) { - return convert(depEntity, null); - } - - @Override - public Department convert(DepJpaEntity entity, Object object) { - - Department obj = this.factory.getInstance(); - - obj.setDepCode(DepCode.valueOf(Optional.ofNullable(entity.getDepCode()).orElse(null))); - obj.setDepName(String.valueOf(entity.getDepName())); - obj.setPDepCode(Optional.ofNullable(entity.getPDepCode()).orElse(null)); - obj.setCDepCode(Optional.ofNullable(entity.getCDepCode()).orElse(null)); - obj.setTDepYn(Optional.ofNullable(entity.getTDepYn()).orElse("N")); - obj.setStaYmd(Optional.ofNullable(entity.getStaYmd()).orElse(null)); - obj.setEndYmd(Optional.ofNullable(entity.getEndYmd()).orElse(null)); - obj.setCreatedAt(Optional.ofNullable(entity.getCreatedAt().toInstant()).orElse(Instant.now())); - obj.setUpdatedAt(Optional.ofNullable(entity.getUpdatedAt().toInstant()).orElse(Instant.now())); - - return obj; - } -} diff --git a/src/main/java/com/cdbd/hr/domain/dep/repository/impl/DepDomainRepository.java b/src/main/java/com/cdbd/hr/domain/dep/repository/impl/DepDomainRepository.java index de159b8..c76f247 100644 --- a/src/main/java/com/cdbd/hr/domain/dep/repository/impl/DepDomainRepository.java +++ b/src/main/java/com/cdbd/hr/domain/dep/repository/impl/DepDomainRepository.java @@ -26,7 +26,6 @@ public class DepDomainRepository implements DepRepository{ public void save(Department department) { Assert.notNull(department, "회원 엔티티는 Null일 수 없습니다."); - System.out.println("JpaDepRepository의 insert까지는 탐" + department); this.jpaRepository.save(JpaConverter(department)); } @@ -45,22 +44,17 @@ public List getAllDepartment() } @Override - public Department findByDepCode(DepCode depCode) + public Department findByDepCodeIgnoreCase(DepCode depCode) { return this.domainconverter(this.jpaRepository.findByDepCode(String.valueOf(depCode)).orElse(null)); } - @Override - public Department findByDepName(String depName) - { - return this.domainconverter(this.jpaRepository.findByDepName(depName).orElse(null)); - } - private DepJpaEntity JpaConverter(Department data) { DepJpaEntity obj = new DepJpaEntity(); obj.setDepCode(String.valueOf(Optional.ofNullable(data.getDepCode()).orElse(null))); + obj.setDepName(String.valueOf(Optional.ofNullable(data.getDepName()).orElse(null))); obj.setPDepCode(Optional.ofNullable(data.getPDepCode()).orElse(null)); obj.setCDepCode(Optional.ofNullable(data.getCDepCode()).orElse(null)); obj.setTDepYn(Optional.ofNullable(data.getTDepYn()).orElse("N")); diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/DepJpaEntity.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/DepJpaEntity.java index 1986edb..266c4c5 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/DepJpaEntity.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/DepJpaEntity.java @@ -1,6 +1,6 @@ package com.cdbd.hr.infrastructure.jpa.entity; -import java.sql.Timestamp; +import java.time.LocalDateTime; import org.hibernate.annotations.Comment; @@ -23,11 +23,11 @@ public class DepJpaEntity { @Column(name = "id") private Long id; - @Column(name = "dep_code") + @Column(name = "dep_code", nullable = false) @Comment("부서코드") private String depCode; - @Column(name = "dep_name") + @Column(name = "dep_name", nullable = false) @Comment("부서명") private String depName; @@ -43,19 +43,19 @@ public class DepJpaEntity { @Comment("최상위부서여부") private String tDepYn; - @Column(name = "sta_ymd") + @Column(name = "sta_ymd", nullable = false) @Comment("시작일") private String staYmd; - @Column(name = "end_ymd") + @Column(name = "end_ymd", nullable = false) @Comment("종료일") private String endYmd; - @Column(name = "created_at", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") + @Column(name = "created_at") @Comment("생성일시") - private Timestamp createdAt; + private LocalDateTime createdAt; - @Column(name = "updated_at", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") + @Column(name = "updated_at") @Comment("수정일시") - private Timestamp updatedAt; + private LocalDateTime updatedAt; } diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/EmpDepJpaEntity.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/EmpDepJpaEntity.java index e1af4e5..cfdecc3 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/EmpDepJpaEntity.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/EmpDepJpaEntity.java @@ -9,7 +9,6 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; @@ -28,7 +27,6 @@ public class EmpDepJpaEntity { @Comment("사번") private String empId; - @ManyToOne @Column(name = "dep_code") @Comment("부서코드") private DepJpaEntity depCode; diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/EmpJpaEntity.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/EmpJpaEntity.java index aebcdd9..188a0aa 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/EmpJpaEntity.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/entity/EmpJpaEntity.java @@ -9,7 +9,6 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; @@ -28,7 +27,6 @@ public class EmpJpaEntity { @Comment("사번") private String empId; - @ManyToOne @Column(name = "shift_id") @Comment("근무형태(근무조)") private String shiftId; diff --git a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/DepJpaRepository.java b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/DepJpaRepository.java index 3b6444b..46c7e03 100644 --- a/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/DepJpaRepository.java +++ b/src/main/java/com/cdbd/hr/infrastructure/jpa/repository/DepJpaRepository.java @@ -11,9 +11,9 @@ public interface DepJpaRepository extends JpaRepository { //부서ID를 기준으로 조회 - Optional findByDepId(String depId); + Optional findByDepCode(String depCode); //부서ID를 기준으로 삭제 - void deleteByDepId(String depId); + void deleteByDepCode(String depcode); } diff --git a/src/test/java/com/cdbd/hr/domain/dep/DepartmentUnitTest.java b/src/test/java/com/cdbd/hr/domain/dep/DepartmentUnitTest.java new file mode 100644 index 0000000..0621e39 --- /dev/null +++ b/src/test/java/com/cdbd/hr/domain/dep/DepartmentUnitTest.java @@ -0,0 +1,150 @@ +package com.cdbd.hr.domain.dep; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.time.Instant; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import com.cdbd.hr.domain.dep.IDTypes.DepCode; +import com.cdbd.hr.domain.dep.repository.impl.DepDomainRepository; + +class DepartmentUnitTest { + + @Mock + private DepDomainRepository repository; + + @InjectMocks + private Department department; + + private DepCode depCode; + private Department sampleDepartment; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + + depCode = new DepCode("D001"); + sampleDepartment = new Department(); + sampleDepartment.setDepCode(depCode); + sampleDepartment.setDepName("IT부서"); + sampleDepartment.setPDepCode("D000"); + sampleDepartment.setCDepCode("D002"); + sampleDepartment.setTDepYn("N"); + sampleDepartment.setStaYmd("20240101"); + sampleDepartment.setEndYmd("99991231"); + sampleDepartment.setCreatedAt(Instant.now()); + sampleDepartment.setUpdatedAt(Instant.now()); + } + + @Test + void 부서_저장_테스트() { + department.save(repository); + verify(repository, times(1)).save(department); + } + + @Test + void 부서_삭제_테스트() { + department.setDepCode(depCode); + department.delete(repository); + verify(repository, times(1)).delete(depCode); + } + + @Test + void 전체_부서_조회_테스트() { + when(repository.getAllDepartment()).thenReturn(Arrays.asList(sampleDepartment)); + List result = department.getDepartmentList(repository); + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals("IT부서", result.get(0).getDepName()); + + } + + @Test + void 부서가_없는_경우_테스트() { + when(repository.getAllDepartment()).thenReturn(Collections.emptyList()); + List result = department.getDepartmentList(repository); + assertNotNull(result); + assertTrue(result.isEmpty()); + } + + @Test + void 부서코드로_조회_테스트() { + when(repository.findByDepCodeIgnoreCase(depCode)).thenReturn(sampleDepartment); + department.setDepCode(depCode); + Department result = department.findByDepCode(repository); + assertNotNull(result); + assertEquals("IT부서", result.getDepName()); + assertEquals(depCode, result.getDepCode()); + } + + @Test + void 대소문자가_다른_부서코드로_조회_테스트() { + when(repository.findByDepCodeIgnoreCase(new DepCode("d001"))).thenReturn(sampleDepartment); + when(repository.findByDepCodeIgnoreCase(new DepCode("D001"))).thenReturn(sampleDepartment); + + department.setDepCode(new DepCode("d001")); + Department result1 = department.findByDepCode(repository); + assertNotNull(result1); + assertEquals(depCode, result1.getDepCode()); + + department.setDepCode(new DepCode("D001")); + Department result2 = department.findByDepCode(repository); + assertNotNull(result2); + assertEquals(depCode, result2.getDepCode()); + } + + @Test + void 존재하지_않는_부서코드로_조회_테스트() { + when(repository.findByDepCodeIgnoreCase(depCode)).thenReturn(null); + department.setDepCode(depCode); + assertThrows(NullPointerException.class, () -> department.findByDepCode(repository)); + } + + @Test + void 특수문자_공백이_포함된_부서코드_조회_테스트() { + when(repository.findByDepCodeIgnoreCase(any(DepCode.class))).thenReturn(sampleDepartment); + + department.setDepCode(new DepCode(" D001")); + Department result1 = department.findByDepCode(repository); + assertNotNull(result1); + assertEquals(depCode, result1.getDepCode()); + + department.setDepCode(new DepCode("D001 ")); + Department result2 = department.findByDepCode(repository); + assertNotNull(result2); + assertEquals(depCode, result2.getDepCode()); + + department.setDepCode(new DepCode(" D0 01")); + Department result3 = department.findByDepCode(repository); + assertNotNull(result3); + assertEquals(depCode, result3.getDepCode()); + } + + @Test + void 부서명_수정_테스트() { + when(repository.findByDepCodeIgnoreCase(depCode)).thenReturn(sampleDepartment); + + department.setDepCode(depCode); + department.setDepName("개발부서"); + department.save(repository); + + verify(repository, times(1)).save(department); + assertEquals("개발부서", department.getDepName()); + } + +} \ No newline at end of file diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/DepJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/DepJpaRepositoryTest.java index 686f602..16d5e70 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/DepJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/DepJpaRepositoryTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; @@ -32,22 +32,22 @@ public void setUp() { depJpaEntity.setPDepCode("PD001"); depJpaEntity.setCDepCode("CD001"); depJpaEntity.setTDepYn("Y"); - depJpaEntity.setStaYmd("2024-01-01"); - depJpaEntity.setEndYmd("2025-01-01"); - depJpaEntity.setCreatedAt(new Timestamp(System.currentTimeMillis())); - depJpaEntity.setUpdatedAt(new Timestamp(System.currentTimeMillis())); + depJpaEntity.setStaYmd("20240101"); + depJpaEntity.setEndYmd("99991231"); + depJpaEntity.setCreatedAt(LocalDateTime.now()); + depJpaEntity.setUpdatedAt(LocalDateTime.now()); - logger.info("객체생성확인: {}", depJpaEntity); + depJpaRepository.save(depJpaEntity); // 사전 저장 + logger.info("객체생성 및 저장 완료: {}", depJpaEntity); } @Test public void 부서생성하기() { - // given: Entity가 준비되었음 + // when: 엔티티를 저장하고 반환된 객체 확인 + Optional savedEntityOpt = depJpaRepository.findByDepCode("D001"); + DepJpaEntity savedEntity = savedEntityOpt.orElseThrow(() -> new AssertionError("저장된 부서가 없습니다.")); - // when: 데이터를 저장하고 반환된 엔티티를 확인 - DepJpaEntity savedEntity = depJpaRepository.save(depJpaEntity); - - // then: 저장된 엔티티의 필드 값이 정확한지 검증 + // then: 저장된 엔티티의 필드 값 검증 assertThat(savedEntity.getDepCode()).isEqualTo("D001"); assertThat(savedEntity.getDepName()).isEqualTo("영업부"); assertThat(savedEntity.getPDepCode()).isEqualTo("PD001"); @@ -62,14 +62,11 @@ public void setUp() { } @Test - public void 부서조회하기() { - // given: Entity를 저장 - depJpaRepository.save(depJpaEntity); - + public void 부서ID로조회하기() { // when: 특정 depCode로 엔티티를 조회 - Optional foundEntity = depJpaRepository.findByDepId("D001"); + Optional foundEntity = depJpaRepository.findByDepCode("D001"); - // then: 조회된 엔티티의 값이 맞는지 확인 + // then: 조회된 엔티티 검증 DepJpaEntity entity = foundEntity.orElseThrow(() -> new AssertionError("조회된 부서가 존재하지 않습니다.")); assertThat(entity.getDepCode()).isEqualTo("D001"); assertThat(entity.getDepName()).isEqualTo("영업부"); @@ -78,19 +75,15 @@ public void setUp() { logger.info("부서 조회 테스트 완료: {}", entity); } - @Test public void 부서삭제하기() { - // given: Entity 저장 - depJpaRepository.save(depJpaEntity); - // when: 엔티티 삭제 - depJpaRepository.deleteByDepId("D001"); + depJpaRepository.deleteByDepCode("D001"); - // then: 삭제 후 조회하여 null 반환되는지 확인 - Optional foundEntity = depJpaRepository.findByDepId("D001"); + // then: 삭제 후 존재 여부 확인 + Optional foundEntity = depJpaRepository.findByDepCode("D001"); - assertThat(foundEntity).isNull(); + assertThat(foundEntity.isPresent()).isFalse(); // 수정됨 logger.info("부서 삭제 테스트 완료. 삭제된 부서: D001"); } } diff --git a/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpDepJpaRepositoryTest.java b/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpDepJpaRepositoryTest.java index 354ee08..81cfb86 100644 --- a/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpDepJpaRepositoryTest.java +++ b/src/test/java/com/cdbd/hr/infrastructure/jpa/EmpDepJpaRepositoryTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; @@ -39,8 +40,8 @@ public void setUp() { depJpaEntity.setTDepYn("Y"); depJpaEntity.setStaYmd("20240101"); depJpaEntity.setEndYmd("99991231"); - depJpaEntity.setCreatedAt(new Timestamp(System.currentTimeMillis())); - depJpaEntity.setUpdatedAt(new Timestamp(System.currentTimeMillis())); + depJpaEntity.setCreatedAt(LocalDateTime.now()); + depJpaEntity.setUpdatedAt(LocalDateTime.now()); depJpaRepository.save(depJpaEntity); // 부서 저장