Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
74d2f76
feat(store): Stores 엔티티 클래스 추가 및 create 팩토리 메서드 구현
Jjiggu May 30, 2025
664f9c7
feat(store): 스토어 생성 API 엔드포인트 추가
Jjiggu May 30, 2025
c5de1b1
feat(store): 스토어 생성 요청 DTO 추가 및 엔티티 변환 구현
Jjiggu May 30, 2025
933ff8b
feat(store): add StoreRepository interface for data access
Jjiggu May 30, 2025
ef91f90
feat(store): 스토어 생성 기능 위한 StoreService 인터페이스 추가
Jjiggu May 30, 2025
5193c7f
feat(store): 스토어 생성 createStore 구현
Jjiggu May 30, 2025
1b590f7
chore(build): configure Gradle plugins and dependencies for Spring Bo…
Jjiggu May 30, 2025
facf48f
feat: add BaseTimeEntity for auditing createdAt field
Jjiggu Jun 1, 2025
63d1715
feat: add @EnableJpaAuditing for auditing createdAt field
Jjiggu Jun 1, 2025
a47ce14
refactor(store): extend Store entity from BaseTimeEntity
Jjiggu Jun 1, 2025
7e90e6e
feat: inherit BaseTimeEntity in StoreCreateRequest dto
Jjiggu Jun 1, 2025
af600f2
feat: inherit BaseTimeEntity in StoreCreateResponse dto
Jjiggu Jun 1, 2025
89312e6
feat(store): return saved entity in createStore service method
Jjiggu Jun 1, 2025
47ad3e5
test(store): add unit test for createStore in StoreService
Jjiggu Jun 1, 2025
6f3a056
test(store): add unit test for StoreController
Jjiggu Jun 1, 2025
79e987b
test(store): add unit test for storeRepository
Jjiggu Jun 1, 2025
e4faf9d
chore(todo): remove default Todo
Jjiggu Jun 1, 2025
b5fb761
refactor(store): add deleted column for soft delete
Jjiggu Jun 2, 2025
40583a2
refactor(store): add deleted column for soft delete
Jjiggu Jun 2, 2025
77a637d
feat(store): add StoreReadDto for store response
Jjiggu Jun 2, 2025
0f8b627
feat(store): add StoreReadResponse for store list response
Jjiggu Jun 2, 2025
4664576
feat(store): add StoreUpdateRequest for store update
Jjiggu Jun 2, 2025
dbe9fef
feat(store): add methods to query non-deleted stores in repository
Jjiggu Jun 2, 2025
b00d5bc
feat(store): add get, update, delete methods to StoreService interface
Jjiggu Jun 2, 2025
1b4519c
feat(store): implements read, update, and delete methods in StoreServ…
Jjiggu Jun 2, 2025
37b26e1
feat(store): add get, update, delete endpoints to StoreController
Jjiggu Jun 2, 2025
e25aa72
fix(store): remove manual setting createdAt for JPA auditing
Jjiggu Jun 2, 2025
6384ffa
refactor(store): remove extends BaseTimeEntity inheritance from Store…
Jjiggu Jun 2, 2025
7ac8913
fix(build): move spring-security-test to testImplementation scope
Jjiggu Jun 2, 2025
ca8f67d
refactor(store): rename SetIsDelete to SetDeleted for consistency
Jjiggu Jun 2, 2025
b917c71
refactor(store): use EntityNotFoundException instead of NotFoundExcep…
Jjiggu Jun 2, 2025
005397c
refactor(store): remove deleted filed
Jjiggu Jun 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,19 @@ dependencies {
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'


// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'org.awaitility:awaitility:4.3.0'
testImplementation 'com.h2database:h2'


}

tasks.named('test') {
Expand Down
8 changes: 5 additions & 3 deletions src/main/java/com/example/gtable/GTableApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

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

@EnableJpaAuditing
@SpringBootApplication
public class GTableApplication {

public static void main(String[] args) {
SpringApplication.run(GTableApplication.class, args);
}
public static void main(String[] args) {
SpringApplication.run(GTableApplication.class, args);
}

}
22 changes: 0 additions & 22 deletions src/main/java/com/example/gtable/TODO/TodoController.java

This file was deleted.

7 changes: 0 additions & 7 deletions src/main/java/com/example/gtable/TODO/TodoRepository.java

This file was deleted.

18 changes: 0 additions & 18 deletions src/main/java/com/example/gtable/TODO/TodoService.java

This file was deleted.

39 changes: 39 additions & 0 deletions src/main/java/com/example/gtable/global/entity/BaseTimeEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.example.gtable.global.entity;

import java.time.LocalDateTime;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@SuperBuilder
@NoArgsConstructor
@Schema(description = "시간 관련 VO")
public abstract class BaseTimeEntity {

@CreatedDate
@Column(updatable = false, name = "created_at")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createdAt;

public BaseTimeEntity(LocalDateTime createdAt) {
this.createdAt = createdAt;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.example.gtable.store.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.gtable.global.api.ApiUtils;
import com.example.gtable.store.dto.StoreCreateRequest;
import com.example.gtable.store.dto.StoreCreateResponse;
import com.example.gtable.store.dto.StoreUpdateRequest;
import com.example.gtable.store.service.StoreService;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequestMapping("/stores")
@RequiredArgsConstructor
public class StoreController {

private final StoreService storeService;

@PostMapping
public ResponseEntity<?> createStore(@Valid @RequestBody StoreCreateRequest request) {
StoreCreateResponse response = storeService.createStore(request);

return ResponseEntity
.status(HttpStatus.CREATED)
.body(
ApiUtils.success(
response
)
);
}

@GetMapping("/all-stores")
public ResponseEntity<?> getAllStores() {
return ResponseEntity
.status(HttpStatus.OK)
.body(
ApiUtils.success(
storeService.getAllStores()
)
);
}

@GetMapping("/{storeId}")
public ResponseEntity<?> getStoreById(@PathVariable Long storeId) {
return ResponseEntity
.status(HttpStatus.OK)
.body(
ApiUtils.success(
storeService.getStoreByStoreId(storeId)
)
);
}

@PatchMapping("/{storeId}")
public ResponseEntity<?> updateStore(
@PathVariable Long storeId,
@Valid @RequestBody StoreUpdateRequest request
) {
return ResponseEntity
.status(HttpStatus.OK)
.body(
ApiUtils.success(
storeService.updateStore(storeId, request)
)
);
}

@DeleteMapping("/{storeId}")
public ResponseEntity<?> deleteStore(@PathVariable Long storeId) {
return ResponseEntity
.ok()
.body(
ApiUtils.success(
storeService.deleteStore(storeId)
)
);
}
}
39 changes: 39 additions & 0 deletions src/main/java/com/example/gtable/store/dto/StoreCreateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.example.gtable.store.dto;

import com.example.gtable.store.model.Store;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class StoreCreateRequest {

@NotNull
private Long departmentId;

@NotBlank
private String name;

private String location;

private String description;

private String storeImageUrl;

public Store toEntity() {
return Store.builder()
.departmentId(departmentId)
.name(name)
.location(location)
.description(description)
.storeImageUrl(storeImageUrl)
.isActive(false)
.deleted(false)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.example.gtable.store.dto;

import java.time.LocalDateTime;

import com.example.gtable.store.model.Store;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@AllArgsConstructor
@Builder
public class StoreCreateResponse {

private Long storeId;
private Long departmentId;
private String name;
private String location;
private String description;
private String storeImageUrl;
private Boolean isActive;
private Boolean deleted;
private LocalDateTime createdAt;

public static StoreCreateResponse fromEntity(Store store) {
return StoreCreateResponse.builder()
.createdAt(store.getCreatedAt())
.storeId(store.getStoreId())
.departmentId(store.getDepartmentId())
.name(store.getName())
.location(store.getLocation())
.description(store.getDescription())
.storeImageUrl(store.getStoreImageUrl())
.isActive(store.getIsActive())
.deleted(store.getDeleted())
.build();
}
}
38 changes: 38 additions & 0 deletions src/main/java/com/example/gtable/store/dto/StoreReadDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.example.gtable.store.dto;

import java.time.LocalDateTime;

import com.example.gtable.store.model.Store;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@AllArgsConstructor
@Builder
public class StoreReadDto {
private Long storeId;
private Long departmentId;
private String name;
private String location;
private String description;
private String storeImageUrl;
private Boolean isActive;
private Boolean deleted;
private LocalDateTime createdAt;

public static StoreReadDto fromEntity(Store store) {
return StoreReadDto.builder()
.createdAt(store.getCreatedAt())
.storeId(store.getStoreId())
.departmentId(store.getDepartmentId())
.name(store.getName())
.location(store.getLocation())
.description(store.getDescription())
.storeImageUrl(store.getStoreImageUrl())
.isActive(store.getIsActive())
.deleted(store.getDeleted())
.build();
}
}
23 changes: 23 additions & 0 deletions src/main/java/com/example/gtable/store/dto/StoreReadResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.example.gtable.store.dto;

import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@AllArgsConstructor
@Builder
public class StoreReadResponse {

private List<StoreReadDto> storeReadDtos;
private boolean hasNext;

public static StoreReadResponse fromEntity(List<StoreReadDto> storeReadDtos, boolean hasNext) {
return StoreReadResponse.builder()
.storeReadDtos(storeReadDtos)
.hasNext(hasNext)
.build();
}
}
18 changes: 18 additions & 0 deletions src/main/java/com/example/gtable/store/dto/StoreUpdateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.gtable.store.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class StoreUpdateRequest {
private String name;
private String location;
private String description;
private String storeImageUrl;
private Boolean isActive;
}
Loading