CoLabor : 리뷰 등록 API 개발 과정

2024. 12. 9. 05:35코딩 도구/프로젝트 개발 및 문제, 오류 해결

반응형

프로젝트 개요

Co-Labor는 외국인 근로자들이 한국에서 직면할 수 있는 문제를 해결하고 안정적으로 정착할 수 있도록 지원하는 플랫폼입니다. 이 플랫폼의 주요 기능 중 하나는 기업 리뷰로, 사용자가 기업 정보를 확인하고 직접 리뷰를 작성할 수 있도록 제공합니다.

 

https://github.com/Co-Labor-Project

 

Pelicans

일단 시도해 보는 새들. Pelicans has 6 repositories available. Follow their code on GitHub.

github.com

 

리뷰 등록 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)를 확인해 "노동자"만 리뷰를 작성할 수 있도록 제한했습니다.

 

반응형