[전국병원정보] SpringJPA API 만들기

Welcome to Seoyun Dev Log·2022년 11월 16일
0
post-thumbnail

🏩 전국 병원정보 검색 기능 🏩

👉 공공데이터포털 전국 병원 정보 TSV 111918건의 데이터 사용

구분SpringMVCRestAPI
Controller@Controller@RestController
Returnview pathJson

구현 기능

  • 데이터 파싱
    • Data Parser : TSV 파일을 [Tab]으로 분리하여 필요한 데이터만 파싱
      • 추출 데이터
        개방서비스명, 개방자치단체코드, 관리번호, 인허가일자,
        영업상태코드 (2: 휴업 3: 폐업 13: 영업중),
        영업상태(1: 영업/정상 2: 휴업 3: 폐업 4: 취소/말소영업상태구분),
        소재지 전화, 소재지 전체 주소, 도로명 주소, 병원명,
        업태구분명, 의료인 수, 입원실 수, 병상 수, 총 면적
  • 병원 전체 리스트 (페이징)
  • 병원명으로 검색
  • 행정자치코드(시군구) 카테고리 구분 기능

테이블 생성

  • Entity
@ToString
@Getter
@Entity
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "nation_wide_hospitals")
public class Hospital {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "open_service_name")
    private String openServiceName; //개방서비스명

    @Column(name = "open_local_government_code") //개방자치단체코드
    private int openLocalGovernmentCode;

    @Column(name = "management_number") //관리번호
    private String managementNumber;

    @Column(name = "license_date")
    private LocalDateTime LicenseDate; //인허가일자

    @Column(name = "business_status")
    private int businessStatus; //1: 영업/정상 2: 휴업 3: 폐업 4: 취소/말소영업상태구분

    @Column(name = "business_status_code")
    private int businessStatusCode; //영업상태코드 2: 휴업 3: 폐업 13: 영업중

    @Column(name = "phone")
    private String phone; // 소재지전화

    @Column(name = "full_address")
    private String fullAddress; //소재지전체주소

    @Column(name = "road_name_address")
    private String roadNameAddress; //도로명전체주소

    @Column(name = "hospital_name")
    private String hospitalName; //사업장명(병원이름)

    @Column(name = "business_type_name")
    private String businessTypeName; //업태구분명

    @Column(name = "healthcare_provider_cnt")
    private int healthcareProviderCnt; //의료인수

    @Column(name = "patient_room_cnt")
    private int patientRoomCnt; //입원실수

    @Column(name = "total_number_of_beds")
    private int totalNumberOfBeds; //병상 수

    @Column(name = "total_area_size")
    private float totalAreaSize; //총면적

}

기능 설명

🏥 병원 전체 리스트 페이징

  • EndPoint 요청 : GET(/hospital)
  • Pageable (size=10, sort=id) / Slice로 받음(성능)
  • JpaRepository findAll 요청
  • 데이터 Model에 넣어서 list view 페이지로 응답

🏥 병원명 검색 기능

  • EndPoint 요청 : GET(/hospital/search?keyword)
  • Containing을 통해 파라미터로 받은 kyeword query 검색
    • findAllByHospitalNameContaining or
select *
from nation_wide_hospitals
where hospital_name like '%서울%';
  • Entity -> DTO로 변환하여 응답
List<HospitalResponse> responseList = findHospitalName
                .stream()
                .map(h -> HospitalFactory.toHospitalResponse(h))
                .collect(Collectors.toList());
  • 데이터 Model에 넣어서 search view 페이지로 응답

🏥 페이지 설명

링크


RestAPI

기능 설명

🏥 한개의 병원 정보 요청

  • EndPoint 요청 : GET(/api/v1/hospital/{id})
  • JpaRepository findById 요청
  • 반환된 Entity -> DTO로 변환
    • 영업 상태 코드 체크 후 텍스트로 변경하여 DTO 인스턴스 생성
      영업 상태 코드 : 13 -> 영업중
      영업 상태 코드 : 3 -> 폐업
      그 외 : 상태 코드
public static HospitalResponse toHospitalResponse(Hospital hospital) {
        HospitalResponse hospitalResponse = HospitalResponse.builder()
                .id(hospital.getId())
                .hospitalName(hospital.getHospitalName())
                .patientRoomCnt(hospital.getPatientRoomCnt())
                .totalNumberOfBeds(hospital.getTotalNumberOfBeds())
                .businessStatus(setBusinessStatusName(hospital.getBusinessStatusCode()))
                .businessTypeName(hospital.getBusinessTypeName())
                .build();
        return hospitalResponse;
}

private static String setBusinessStatusName(int businessStatusCode) {
        if (businessStatusCode == 13) {
            return "영업중";
        } else if (businessStatusCode == 3) {
            return "폐업";
        } else {
            return String.valueOf(businessStatusCode);
        }
}
  • ResponseEntity 객체를 통해 Json 형태로 응답

Test code

Controller

⛑️하나의 병원 정보 가져오기

  • WebMvcTest : 해당 클래스 지정하여 테스트 진행

  • MockMvc / MockBean : service

  • Mockito : given, verify

import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.verify;
  • MockMvn : perform, andExpect, andDo
    Endpoint url 요청 후 기대하는 필드값이 들어오는지 확인

📝 Article 게시판 CRUD 📝

👉 게시판 CRUD API

게시판RestAPI
기능@Controller@RestController
Returnview pathJson

구현 기능

테스트 코드

controller test

  • MockMvc / @MockBean

⚙️ 회원가입 API

Users API

  • RestController
  • Json 반환

기능 설명

회원가입 Join

  • EndPoint 요청 : POST(/api/v1/users)
  • 사용자 Input : username, password
    username (unique) 사용자 고유 아이디

DB에 사용자 중복 여부 확인 후 없으면 저장
있으면 username, "이미 존재하는 회원입니다" 메세지를 Json형태로 반환해준다

  • 중복 체크 로직
public UserResponse join(UserJoinRequest userJoinRequest) {
        Optional<Users> findUser = userJpaRepository.findByUsername(userJoinRequest.getUsername());

        if (findUser.isEmpty()) {
            Users saveUser = userJpaRepository.save(UsersFactory.toUsers(userJoinRequest)); //Entity 변환 후 저장
            return UsersFactory.toUserJoinResponse(saveUser); //ResponseDto 변환
        }

        return joinFalse(userJoinRequest.getUsername());
}
private UserResponse joinFalse(String username) {
        return new UserResponse(username, "이미 존재하는 아이디 입니다.");
}
profile
하루 일지 보단 행동 고찰 과정에 대한 개발 블로그

0개의 댓글