CoLabor : 리뷰 등록 API 개발 과정
2024. 12. 9. 05:35ㆍ코딩 도구/프로젝트 개발 및 문제, 오류 해결
반응형
프로젝트 개요
Co-Labor는 외국인 근로자들이 한국에서 직면할 수 있는 문제를 해결하고 안정적으로 정착할 수 있도록 지원하는 플랫폼입니다. 이 플랫폼의 주요 기능 중 하나는 기업 리뷰로, 사용자가 기업 정보를 확인하고 직접 리뷰를 작성할 수 있도록 제공합니다.
https://github.com/Co-Labor-Project
리뷰 등록 API의 역할
리뷰 등록 API는 사용자가 특정 기업에 대해 리뷰를 작성할 수 있도록 지원합니다. 이를 통해 근로자들은 기업에 대한 더 나은 이해를 돕고, 잠재적인 근로자들에게 유용한 정보를 제공할 수 있습니다. 이 기능은 사용자 권한 검증, 데이터 유효성 검사, 그리고 리뷰 데이터를 데이터베이스에 저장하는 과정을 포함합니다.
개발 과정
기능 요구사항
- 리뷰 작성 제한: 로그인한 사용자만 리뷰를 작성할 수 있으며, 사용자 유형이 "노동자"일 때만 작성 가능합니다.
- 기업 존재 여부 확인: 사용자가 입력한 기업 ID를 기반으로 해당 기업이 존재하는지 확인합니다.
- 리뷰 데이터 저장: 사용자 입력 데이터를 Review 엔티티로 변환 후 저장합니다.
구현 주요 코드
컨트롤러는 사용자의 요청을 처리하고 필요한 데이터를 서비스 레이어에 전달합니다.
아래는 리뷰 등록 API의 핵심 코드입니다.
@Operation(summary = "리뷰 작성", description = "특정 기업에 대한 리뷰를 작성합니다.")
@PostMapping("/{enterpriseId}")
public ResponseEntity<Object> addReview(
@Parameter(description = "기업 ID") @PathVariable("enterpriseId") String enterprise_id,
@RequestBody ReviewDTO reviewDTO, HttpServletRequest httpServletRequest) {
// 세션에서 사용자 정보 가져오기
Optional<Map<String, Object>> userSession = getSessionUser(httpServletRequest);
if (userSession.isEmpty()) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
.body(Map.of("message", "로그인되지 않았습니다. 세션이 만료되었거나 유효하지 않습니다."));
}
String username = userSession.get().get("username").toString();
String userType = userSession.get().get("userType").toString();
// 사용자 권한 확인
if (!"labor_user".equals(userType)) {
return ResponseEntity.status(HttpStatus.FORBIDDEN)
.body(Map.of("message", "리뷰를 작성할 권한이 없습니다. 노동자만 작성할 수 있습니다."));
}
// 기업 및 사용자 확인
Optional<LaborUser> laborUserOpt = authService.findLaborUserById(username);
Optional<Enterprise> enterpriseOpt = enterpriseService.getEnterpriseById(enterprise_id);
if (laborUserOpt.isEmpty() || enterpriseOpt.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("message", "사용자 또는 기업을 찾을 수 없습니다."));
}
// 리뷰 데이터 생성
Review review = new Review();
review.setLaborUser(laborUserOpt.get());
review.setEnterprise(enterpriseOpt.get());
review.setTitle(reviewDTO.getTitle());
review.setRating(reviewDTO.getRating());
review.setPros(reviewDTO.getPros());
review.setCons(reviewDTO.getCons());
review.setLike_count(0);
// 리뷰 저장
return ResponseEntity.ok(reviewService.addReview(review));
}
데이터 처리
리뷰 데이터는 ReviewDTO 객체로부터 전달되며, 이를 Review 엔티티로 변환 후 데이터베이스에 저장합니다. 다음은 Review 엔티티의 주요 필드입니다.
@Entity
@Table(name = "review")
public class Review {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long review_id;
@ManyToOne
@JoinColumn(name = "labor_user_id")
private LaborUser laborUser;
@ManyToOne
@JoinColumn(name = "enterprise_id")
private Enterprise enterprise;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private int rating;
@Column(columnDefinition = "TEXT")
private String pros;
@Column(columnDefinition = "TEXT")
private String cons;
@Column(nullable = false)
private int like_count;
@Column(nullable = false, updatable = false)
private LocalDate created_at;
@PrePersist
protected void onCreate() {
created_at = LocalDate.now();
}
}
개발 중 직면했던 문제와 해결
- 데이터 유효성 검사
- 문제: 존재하지 않는 기업 ID나 잘못된 리뷰 데이터를 처리해야 했습니다.
- 해결: Optional 객체를 활용해 데이터의 존재 여부를 검증하고, 적절한 HTTP 상태 코드를 반환했습니다.
- 사용자 권한 제한
- 문제: 모든 사용자가 리뷰를 작성할 수 있는 보안 문제를 방지해야 했습니다.
- 해결: 사용자 유형 필드(userType)를 확인해 "노동자"만 리뷰를 작성할 수 있도록 제한했습니다.
반응형
'코딩 도구 > 프로젝트 개발 및 문제, 오류 해결' 카테고리의 다른 글
[MacOS] VSCode C++ 컴파일 오류와 그 해결법 (1) | 2025.01.01 |
---|---|
LottoVerse : 미국의 Powerball 및 Mega Millions (2) | 2024.12.31 |
Togather : 추가 문제 해결과 채팅 코드 구현 (2) (2) | 2024.12.03 |
Togather : 채팅 기능 구현과 문제 해결 과정 (1) (1) | 2024.11.26 |
CoLabor : AI 법률 챗봇 파인튜닝 : 외국인 노동자를 위한 법률봇 개발 과정 (5) | 2024.11.11 |