Skip to content

Commit 548ea43

Browse files
Sihun23Sihun23
authored andcommitted
CLAP-116 fix:에러코드 수정
1 parent db9c861 commit 548ea43

File tree

6 files changed

+108
-62
lines changed

6 files changed

+108
-62
lines changed

src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import clap.server.adapter.inbound.security.SecurityUserDetails;
44
import clap.server.application.port.inbound.management.RegisterMemberUsecase;
55
import clap.server.common.annotation.architecture.WebAdapter;
6+
import clap.server.exception.ApplicationException;
67
import io.swagger.v3.oas.annotations.Operation;
78
import org.springframework.http.HttpStatus;
89
import org.springframework.http.ResponseEntity;
@@ -23,7 +24,6 @@ public RegisterMemberCsvController(@Qualifier("registerMemberCsvService") Regist
2324
this.registerMemberUsecase = registerMemberUsecase;
2425
}
2526

26-
2727
@Operation(summary = "CSV 파일로 회원 등록 API")
2828
@PostMapping("/members/upload")
2929
@Secured("ROLE_ADMIN")
@@ -33,11 +33,12 @@ public ResponseEntity<String> registerMembersFromCsv(
3333
try {
3434
int addedCount = registerMemberUsecase.registerMembersFromCsv(userInfo.getUserId(), file);
3535
return ResponseEntity.ok(addedCount + "명의 회원이 등록되었습니다.");
36-
} catch (IllegalArgumentException e) {
37-
return ResponseEntity.badRequest().body("CSV 형식 오류: " + e.getMessage());
36+
} catch (ApplicationException e) {
37+
return ResponseEntity.status(e.getCode().getHttpStatus())
38+
.body(e.getCode().getMessage());
3839
} catch (Exception e) {
3940
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
40-
.body("회원 등록 중 오류가 발생했습니다: " + e.getMessage());
41+
.body("회원 등록 중 알 수 없는 오류가 발생했습니다: " + e.getMessage());
4142
}
4243
}
43-
}
44+
}
Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,53 @@
1-
package clap.server.adapter.outbound.persistense;
1+
package clap.server.adapter.outbound.persistense;
22

3-
import clap.server.adapter.inbound.web.dto.admin.RegisterMemberRequest;
4-
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
5-
import org.springframework.stereotype.Component;
6-
import org.springframework.web.multipart.MultipartFile;
3+
import clap.server.adapter.inbound.web.dto.admin.RegisterMemberRequest;
4+
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
5+
import clap.server.exception.ApplicationException;
6+
import clap.server.exception.code.MemberErrorCode;
7+
import org.springframework.stereotype.Component;
8+
import org.springframework.web.multipart.MultipartFile;
9+
import lombok.extern.slf4j.Slf4j;
10+
import clap.server.exception.ApplicationException;
11+
import clap.server.exception.code.MemberErrorCode;
712

8-
import java.io.BufferedReader;
9-
import java.io.IOException;
10-
import java.io.InputStreamReader;
11-
import java.util.ArrayList;
12-
import java.util.List;
13+
import java.io.BufferedReader;
14+
import java.io.IOException;
15+
import java.io.InputStreamReader;
16+
import java.util.ArrayList;
17+
import java.util.List;
1318

19+
@Slf4j
20+
@Component
21+
public class CsvParseAdapter {
1422

15-
@Component
16-
public class CsvParseAdapter {
23+
public List<RegisterMemberRequest> parse(MultipartFile file) throws IOException {
24+
List<RegisterMemberRequest> memberRequests = new ArrayList<>();
1725

18-
public List<RegisterMemberRequest> parse(MultipartFile file) throws IOException {
19-
List<RegisterMemberRequest> memberRequests = new ArrayList<>();
20-
21-
try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
22-
String line;
23-
int lineNumber = 0;
24-
while ((line = reader.readLine()) != null) {
25-
lineNumber++;
26+
try (BufferedReader reader = new BufferedReader(new InputStreamReader(file.getInputStream()))) {
27+
String line;
28+
int lineNumber = 0;
29+
while ((line = reader.readLine()) != null) {
30+
lineNumber++;
31+
try {
2632
String[] fields = line.split(",");
27-
28-
// 필드 검증
2933
if (fields.length != 7) {
30-
throw new IllegalArgumentException("CSV 데이터가 잘못되었습니다. " + lineNumber + "번째 줄");
31-
}
32-
try {
33-
memberRequests.add(new RegisterMemberRequest(
34-
fields[0].trim(), // name
35-
fields[4].trim(), // email
36-
fields[1].trim(), // nickname
37-
Boolean.valueOf(fields[6].trim()), // isReviewer
38-
Long.valueOf(fields[2].trim()), // departmentId
39-
MemberRole.valueOf(fields[5].trim()), // role
40-
fields[3].trim() // departmentRole
41-
));
42-
} catch (Exception e) {
43-
throw new IllegalArgumentException("CSV 데이터 파싱 오류: " + lineNumber + "번째 줄, 내용: " + line, e);
34+
throw ApplicationException.from(MemberErrorCode.INVALID_CSV_FORMAT);
4435
}
36+
37+
memberRequests.add(new RegisterMemberRequest(
38+
fields[0].trim(), // name
39+
fields[4].trim(), // email
40+
fields[1].trim(), // nickname
41+
Boolean.parseBoolean(fields[6].trim()), // isReviewer
42+
Long.parseLong(fields[2].trim()), // departmentId
43+
MemberRole.valueOf(fields[5].trim()), // role
44+
fields[3].trim() // departmentRole
45+
));
46+
} catch (Exception e) {
47+
throw ApplicationException.from(MemberErrorCode.CSV_PARSING_ERROR);
4548
}
4649
}
47-
return memberRequests;
4850
}
51+
return memberRequests;
4952
}
53+
}

src/main/java/clap/server/application/port/inbound/management/RegisterMemberCsvUsecase.java

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/main/java/clap/server/application/service/admin/RegisterMemberCsvService.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,48 @@
33
import clap.server.adapter.inbound.web.dto.admin.RegisterMemberRequest;
44
import clap.server.adapter.outbound.persistense.CsvParseAdapter;
55
import clap.server.application.port.inbound.management.RegisterMemberUsecase;
6-
import clap.server.application.port.outbound.member.CommandMemberPort;
7-
import clap.server.domain.model.member.Member;
6+
import clap.server.exception.ApplicationException;
7+
import clap.server.exception.code.MemberErrorCode;
88
import lombok.RequiredArgsConstructor;
9+
import lombok.extern.slf4j.Slf4j;
910
import org.springframework.stereotype.Service;
1011
import org.springframework.transaction.annotation.Transactional;
1112
import org.springframework.web.multipart.MultipartFile;
13+
import clap.server.exception.ApplicationException;
14+
import clap.server.exception.code.MemberErrorCode;
1215

1316
import java.io.IOException;
1417
import java.util.List;
1518

19+
@Slf4j
1620
@Service
1721
@RequiredArgsConstructor
1822
public class RegisterMemberCsvService implements RegisterMemberUsecase {
1923
private final CsvParseAdapter csvParser;
2024

21-
2225
@Override
2326
@Transactional
2427
public int registerMembersFromCsv(Long adminId, MultipartFile file) {
2528
try {
26-
// CSV 파싱
2729
List<RegisterMemberRequest> memberRequests = csvParser.parse(file);
2830

29-
// 각 회원 등록 호출
30-
memberRequests.forEach(request -> registerMember(adminId, request));
31-
32-
return memberRequests.size();
31+
int successCount = 0;
32+
for (RegisterMemberRequest request : memberRequests) {
33+
try {
34+
registerMember(adminId, request);
35+
successCount++;
36+
} catch (Exception e) {
37+
throw ApplicationException.from(MemberErrorCode.MEMBER_REGISTRATION_FAILED);
38+
}
39+
}
40+
return successCount;
3341
} catch (IOException e) {
34-
throw new RuntimeException("CSV 파일 처리 중 오류 발생", e);
42+
throw ApplicationException.from(MemberErrorCode.CSV_PARSING_ERROR);
3543
}
3644
}
3745

3846
@Override
3947
@Transactional
4048
public void registerMember(Long adminId, RegisterMemberRequest request) {
41-
// 기존 단일 회원 추가 로직 그대로 유지
4249
}
4350
}

src/main/java/clap/server/exception/code/MemberErrorCode.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
public enum MemberErrorCode implements BaseErrorCode {
1010
MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "MEMBER_001", "회원을 찾을 수 없습니다."),
1111
ACTIVE_MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "MEMBER_002", "활성화 회원을 찾을 수 없습니다."),
12+
INVALID_CSV_FORMAT(HttpStatus.BAD_REQUEST, "MEMBER_003", "CSV 파일 형식이 잘못되었습니다."),
13+
CSV_PARSING_ERROR(HttpStatus.BAD_REQUEST, "MEMBER_004", "CSV 데이터 파싱 중 오류가 발생했습니다."),
14+
MEMBER_REGISTRATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "MEMBER_005", "회원 등록 중 오류가 발생했습니다."),
1215
;
1316

1417
private final HttpStatus httpStatus;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
spring:
2+
flyway:
3+
enabled: false # Flyway 비활성화
4+
elasticsearch:
5+
enabled: false # Elasticsearch 비활성화
6+
7+
application:
8+
name: taskflow # 애플리케이션 이름 설정
9+
10+
datasource:
11+
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE # H2 임베디드 메모리 데이터베이스
12+
driver-class-name: org.h2.Driver # H2 데이터베이스 드라이버
13+
username: sa # 데이터베이스 사용자명
14+
password: # 비밀번호 없음
15+
sql:
16+
init:
17+
mode: always # SQL 초기화 활성화
18+
19+
jpa:
20+
hibernate:
21+
ddl-auto: create-drop # 테스트 실행 시 스키마 생성 및 삭제
22+
properties:
23+
hibernate:
24+
dialect: org.hibernate.dialect.H2Dialect # H2용 방언 설정
25+
show_sql: true # SQL 쿼리 출력
26+
format_sql: true # SQL 쿼리를 보기 좋게 출력
27+
use_sql_comments: true # SQL 쿼리에 주석 포함
28+
default_batch_fetch_size: 1000 # 배치 페치 크기 설정
29+
30+
logging:
31+
level:
32+
root: debug # 디버그 레벨로 로그 출력
33+
34+
swagger:
35+
server:
36+
url: http://localhost:8080 # Swagger 기본 서버 URL
37+
38+
jwt:
39+
secret-key:
40+
access-token: exampleSecretKeyForTFSystemAccessSecretKeyTestForPadding
41+
temporary-token: exampleSecretKeyForTFSystem

0 commit comments

Comments
 (0)