Skip to content

npole0103/mims-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 

Repository files navigation

mims-backend

Medical Information Monitoring Service - Backend

세나클 소프트 인턴 프로젝트

프로젝트 소개

서비스명 : MIMS(Medical Information Monitoring Service)

MIMS_logo

기간 : 22.07.25. ~ 22.08.31.

인원 : 2명(Full-Stack)

역할

  • 백엔드 개발
    • 셀레니움 데이터 PoC
    • DB 및 API 설계(공통)
    • 태그 모니터링 Controller/Service/Repository/QueryDSL
    • 모니터링 리시버 Controller/Service/Repository/QueryDSL
    • 대시보드 API 코드 작성
    • 변화되는 글 체크 알고리즘 설계
    • 스케줄러 아이디어
    • 유틸 클래스 코드 작성
    • 테스트 코드 작성
    • 프로그램 동작 로직 설계
  • 프론트 개발
    • 공통 컴포넌트 코드 작성
    • 유저 전체 조회 페이지 및 컴포넌트 코드 작성
    • 세부 유저 조회 페이지 및 컴포넌트 코드 작성
    • 유저 검색 포멧 구현
    • 모니터링 아이템 세부 페이지 및 컴포넌트 코드 작성
  • PPT 및 가이드라인 제작

느낀점

  • 테스트 코드 중요성 -> 데이터 PoC
  • 의사소통의 중요성 -> 이해하는 부분이 달라서 구현에 문제가 생기는 경우
  • 코드 모듈화의 중요성 -> 테스트 코드 짤 때, 모듈화를 신경쓰지 않고 짰더니 결합도가 높아져서, 분리가 힘든 상황을 맞딱드림. 테스트 코드를 짜더라도, 모듈화를 잘하자.
  • DB 엔티티 설계 -> 인덱싱을 안 걸꺼면 여러 칼럼들 Json으로 관리할 것인지? 등등
  • 테스크 스케줄링 하기 -> 주기적으로 실행하고 하는 process로 테스크를 만들고 스케줄링으로 관리 rout

프로젝트 개요

EMR 서비스

  • 가이드 지침 + 공단 지침 -> 데이터
  • 청구나 심사가 오픈되어 있고 추가되거나 수정되는 부분을 계속 반영해야 함
  • EX) 코로나 검사에 대한 공제가 새로 생김. 이것이 고지 형태로 나옴.
  • 이런 변화된 부분들을 빠르게 서비스에 반영하는 것이 중요.
  • 이런 고지들은 여러 기관 사이트에 분포되어 있음.

각 사이트별 추가/변경되는 고지들을 모니터링 하는 서비스의 필요성

기술

Backend

  • Spring Boot(v.2.7.2)
  • MySQL
  • Spring JPA
  • MapStruct
  • QueryDSL
  • Selenium

Frontend

  • React.js
  • Recoil
  • Scss
  • Axios
  • React-icons
  • Http-proxy-middleware

이슈 및 트러블 슈팅

1. URL 리다이렉션이 안되는 웹페이지 1. HttpClient로 GET, POST 요청 직접 하는 방법 2. 셀레니움에서 XPath 경로를 입력받아 순차 접속 하는 방법

2. 스케줄링, 모니터링 아이템에 따른 일정 주기로 크롤링 후 알림 기능

  • Springframework ThreadPoolTaskScheduler 사용

3. Service 처리 로직

  • boilerplate 참고 + 비지니스 로직은 서비스 단에서 처리

4. 파일 및 폴더구조

- business
    - service
- config
    - querydsl
    - scheduler
- controller
- domain
    - converter
    - dto
    - enumtype
    - mapper
        - decorator
    - model
- repository
    - custom
    - implementation
- utils

5. N:M 관계의 DB 모델 구조에서 Entity 내에 상속까지 쓰는 경우. 조회할 테이블을 알 수 없는 상황 MonitoringReceiver와 MonitoringItem이 ManyToOne / OneToMany로 연결되어 있는 상황에서 상속 받은 각 3개의 테이블을 N:M으로 매핑 불가. 모니터링 아이템 아이디를 3개를 만들어주던지, 모니터링 리시버를 3개를 만들어주던지 해야함

  • Spring 상속 전략으로 Single Table 전략 사용. 각 아이템에 대한 3개의 테이블을 싱글 테이블로 관리.

6. 추후 다른 사이트를 추가하더라도 무리 없게 공통적인 데이터에 한에 추출 - 크게 3가지로 분류 1. HTML Tag 분석 2. Json Api 분석 3. Content 분석

7. 모니터링 아이템 비교 알고리즘에 List 형태의 Post 데이터를 Map으로 치환하여 key 검색

  • Map으로 치환하여 find(containsKey) 할 때 O(1)의 시간복잡도

8. deleteAll 메소드 쿼리 30번 vs deleteAllInBatch 메소드 쿼리문 1개 성능 최적화

  • deleteAll 쿼리문 대신 deleteAllInBatch 사용하여 쿼리 최적화

9. 메소드 분리 전략. 비지니스 로직 공통 부분 리펙토링 진행

  • 테스트 케이스 작성 후 공통으로 사용되는 로직을 메소드화 하여 재사용

10. check 로직 내부의 sendMessage()를 MessageDto를 생성해 메소드 분리

  • check 메소드와 send 메소드 2개로 분리
  • check 메소드는 순수하게 새로운/수정된 글만 체킹
  • send 메소드는 check에서 도출된 MessageDto를 기반으로 슬랙 메시지 전송

11. 테스트 코드 작성 시 Transactional + RollBack DB 저장 이슈

  • 테스트 코드는 Transactional이 붙어있어도 테스트 완료 직후 RollBack 되어 실제로는 저장되지 않음.
  • @Rollback(false) 어노테이션을 사용하여 이를 해결

12. 유틸 클래스 vs 서비스 클래스

JAVA Collection Time Complexity

Inheritance Single-Table 전략

싱글테이블 전략 사용시 레포지토리 설정

셀레니움 초기 세팅 for Java

headless 옵션 시에 maximize 작동 안함

문자열 자르기(substring, split)

다중 공백 정규표현식

HttpClient

스프링 테스크 스케줄러 총정리

테스트 코드에서 LazyInitializationException

테스트 코드에서 트랜젝션 사용시 save 안됨

테스트 코드 AssertThat

서비스 vs 유틸리티 유틸화

HTTP 상태 코드

@Transactional

AOP(Aspect Oriented Programming) -관점 지향 프로그래밍

JPA 양방향 순환 참조

Mapper + queryDSL -> 매핑 효율적으로, 대용량 데이터 서치

About

Medical Information Monitoring Service - Backend

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published