Skip to content

사용 기술 선택

Yujin Kim edited this page Dec 28, 2022 · 2 revisions

Asciidoctor

  • 한 줄 소개

    • adoc 파일을 html 등으로 변환해주는 문서 도구
  • 제안 배경 (요구사항, 사용 목적)

    • adoc : API 문서 작성시 필요한 문서 언어
    • 마크 다운과 비교 대상
  • 비교 : ‘Markdown’ vs ‘Asciidoc’

    • Markdown
      • 장점 : 단순한 표현력
      • 단점 : 복잡한 기능 못 씀
    • Asciidoc
      • 장점 : 전문적 문서 작성할 수 있는 강력한 표현력을 가지고 있음
        • include 다른 asciidoc 문서를 현재 문서로 가져와 포함시킬 수 있다
      • 단점 : 마크다운에 비해 공부해야할게 많음
  • 사용방법

    • asciidoctorExt에 spring-restdocs-asciidoctor의존성을 추가한다.

    • 아래처럼 adoc 파일을 작성하고, dsciidoctor 테스크를 실행하면 html문서가 생성됨

      = Member API 문서
      :doctype: book
      :icons: font
      :source-highlighter: highlightjs
      :toc: left
      :toclevels: 3
      
      == 회원 가져오기
      
      === Request
      
      include::{snippets}/members/findMemberById/http-request.adoc[]
      
      === Response
      
      include::{snippets}/members/findMemberById/http-response.adoc[]

      Untitled2

    • 스프링 어플리케이션이 직접 해당 문서를 포함해 jar파일이 만들어지도록 build.gradle에 아래 내용 추가

      bootJar {
      	dependsOn asciidoctor // (1)
      	from("${asciidoctor.outputDir}") { // (2)
      		into 'static/docs'
      	}
      }
  • 참고자료

MockMvc(@WebMvcTest)

  • 한 줄 소개

    • Spring Rest Docs를 위해 사용하는 테스트 도구 중 하나
  • 제안 배경 (요구사항, 사용 목적)

    • Spring REST Docs를 사용하려면 테스트 코드를 반드시 작성해야 함
    • 따라서 테스트 도구를 선택해야 되는 상황
  • 비교 : ‘MockMvc’ vs ‘RestAssured’

    • RestAssured
      • @SpringBootTest 와 기본적으로 사용
        • 장점 : 실제환경과 동일한 환경 테스트 가능
          • 스프링의 전체 빈을 컨텍스트에 모두 띄워서 테스트 환경 구동
        • 단점 : 느리고, 테스트 실행 비용이 많이 든다
    • MockMvc
      • @SpringBootTest 와 사용할 수도 있고, @WebMvcTest와 함께 사용할 수도 있음
      • @WebMvcTest
        • 장점 : 빠르고, 테스트 실행 비용이 적게 든다.

          • 슬라이스 테스트. 독립적으로 하나의 계층만 테스트하는 기법 사용

            ⇒ 일반적으로 문서화를 위한 컨트롤러 테스트를 작성할 때 컨트롤러만 독립적으로 테스트

        • 단점 : 어플리케이션 전체를 띄우지 않으므로, 실제 환경과 동일한 환경은 아님

  • 사용방법

    • MockMvc를 사용하기 위한 의존성을 추가한다.
    @AutoConfigureRestDocs
    @WebMvcTest(MemberController.class)
    class MemberControllerTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @MockBean // MemberController이 의존하는 빈을 모킹
        private MemberService memberService;
    
        @DisplayName("멤버를 가져온다.")
        @Test
        void findMemberById() throws Exception {
            // given
            given(memberService.findMemberById(any()))
                    .willReturn(new MemberDto(1L, "후디", "[email protected]"));
    
            // when & then
            mockMvc.perform(MockMvcRequestBuilders.get("/members/1"))
                    .andDo(MockMvcResultHandlers.print())
                    .andDo(MockMvcRestDocumentation.document("members/findMemberById",
                            Preprocessors.preprocessRequest(prettyPrint()),
                            Preprocessors.preprocessResponse(prettyPrint())))
                    .andExpect(MockMvcResultMatchers.status().isOk());
        }
    }
  • 참고자료

DDD (Domain Driven Design): 도메인 주도 설계

  • 한 줄 소개

    Untitled3

    • 도메인 패턴을 중심에 놓고 설계하는 방식
    • 데이터 중심의 접근법을 탈피해서 순수한 도메인의 모델과 로직에 집중
    • 소프트웨어 엔티티와 도메인 컨셉트를 가능한 가장 가까이 일치시키는 것
    • 실제 코드로 구현 가능한 현실성 있는 도메인 모델 분석과 그것을 추상화하는 설계
  • 제안 배경 (요구사항, 사용 목적)

    • 요새 MSA를 많이 찾던데, MSA에서 도메인 주도 설계가 많이 쓰인다
  • 장점

    • 도메인에 집중할 수 있는 설계방식이다
  • 단점

    • 설계에 좀 오래 걸릴 수 있다
  • 사용방법

  • 참고자료

AOP (Aspect Oriented Programming)

travis ci

  • 한 줄 소개

    • aws code pipeline 돈 많이 들면 이거 쓰자
    • ci 도구
    • gitmarcket에서 이용가능, public repository에서 무료로 이용 가능
    • 깃헙에 호스팅 되는 소프트웨어 프로젝트의 빌드, 테스트를 위해 사용됨
  • 제안 배경 (요구사항, 사용 목적)

    • CI 구현
    • CI를 성공적으로 구현할 경우 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트 되어 레포지토리에 통합
  • 장점

    • public repository에서 무료로 이용 가능
    • 빌드를 해준다
    • 테스트도 해준다
    • 직접 서버를 운영할 필요 없이, Travis에서 알아서 VM으로 호스팅해 줌
  • 단점

    • 유료 서비스를 사용할 경우, 가격이 꽤 비싸다
  • 사용방법

    • 트레비스 사이트에서 레포지터리 등록하고, yml 파일 설정한다
    • amazon s3에 트레비스 서버에서 생성된 jar 파일 저장
    • aws CodeDeploy에서 배포
  • 참고자료

    [CI/CD] Travis CI를 활용한 배포 자동화 (1) https://hyeonic.tistory.com/210

    [CI/CD] Jenkins vs GitLabCI vs Travis https://owin2828.github.io/devlog/2020/01/09/cicd-1.html

Grafana (+ Prometheus)

  • 한 줄 소개

    • 로그 수집
    • Prometheus: 대상 시스템으로부터 각종 모니터링 지표를 수집하여 저장하고 검색할 수 있는 시스템
    • Grafana: 프로메테우스를 비롯한 여러 데이터들을 시각화해주는 모니터링 툴
  • 제안 배경 (요구사항, 사용 목적)

    • 로그 수집
    • 모니터링
  • 장점

    • 그라파나는 다양한 DB 연결 가능 : AWS 클라우드워치를 데이터 소스로 사용 가능
  • 단점

    • 서버를 하나 더 띄우는게 좋을 것 같다.. ec2 필요
    • Grafana는 주로 시계열 분석을 수행하기 위해 구축 → 다른 보고 유형이 필요한 경우 기능이 제한될 수 있음
  • 사용방법

    • 도커로 띄우고 yml 설정한 다음 연결한다
  • 비슷한 도구

    • elastic search + kibana
  • 참고자료

Jacoco

  • 한 줄 소개
    • Java code coverage의 약자로 junit 테스트의 결과를 바탕으로 커버리지를 결과를 리포트 해주는 라이브러리
    • 코드 정적 분석도구인 sonarqube와 연계하여 사용하는 경우가 많음
    • 코드 커버리지에 대한 결과를 html이나 xml, csv와 같은 리포트로 생성한다.
    • 설정한 커버리지를 만족하는지 여부를 확인할 수 있다.
💡 코드 커버리지? - 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표

sonarlint (sonarqube)

  • 한 줄 소개

    • sonarqube
      • 정적분석 도구
      • 소냐큐브 서버를 띄워서 Jacoco가 만들어낸 리포트(.xml)를 전송하면 웹으로 통계를 볼 수 있다
      • 실제로 Docker로 쉽게 설치한 후, 젠킨스 같은 도구로 코드를 컴파일/빌드하고 소냐큐브에게 API로 보내 검사를 의뢰하는게 일반적인 구성
    • sonarlint: SonarQube를 베이스로 만든 IntelliJ, Eclipse, VsCode등에 있는 IDE 플러그인
  • 제안 배경 (요구사항, 사용 목적)

    • 정적 분석 도구 → 소스코드의 구조적인 문제, 잠재적 위험성, 코드 컨벤션(냄새나는 코드)를 찾는데 사용
    • 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지(Jacoco), 코드 복잡도, 버그 및 취약점등
  • 장점

    • 또한 레퍼런스가 많고 기능이 좋아서, 왠만한 CI/CD 도구들과는 다 호환된다
  • 단점

    • 소나큐브: ec2 필요

    Untitled4

      - SonarQube는 코드를 분석하는 [Scanner]와 분석결과를 API로 받아 보고서를 만드는 [웹 서버]로 구성됩니다.
    
  • 사용방법

    • 커밋전에 SonarLint 분석 옵션을 넣는다
  • 참고자료

Spring Security

  • 한 줄 소개
    • 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크
    • '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리
  • 제안 배경 (요구사항, 사용 목적)
    • 로그인
    • sql injection 방어 → 근데 하는 방법 검색해도 잘 안 나옴. jpa는 자동으로 방어 된다고 함
    • xss 방어 → 근데 하는 방법 검색해도 잘 안 나옴.
  • 장점
    • 인증, 인가 구현할 때 유용하다고 한다
  • 단점
    • 어렵다
  • 사용방법
  • 참고자료

Spring Rest Docs

Redis

  • 한 줄 소개
    • 인메모리 캐시 DB
  • 제안 배경 (요구사항, 사용 목적)
    • 캐시 DB로 활용 → 동작속도 빠르게
    • 채팅이 도입될 경우 메시지 전달함으로도 사용 가능할 듯ㅎㅎ
  • 장점
    • 인메모리 DB라서 빠르다
  • 단점
    • 인메모리
      • 서버가 꺼지면 데이터가 날라갈 수 있다
      • 용량이 일반 DB에 비해 적다
  • 구현방법
    • ec2에 레디스를 설치한다

결론

  • 아스키독
    • 단기간에 완성시켜야 하니까 마크다운을 일단 사용한다.
    • 사용하다가 불편하면 아스키 닥터를 더 알아본다.
  • MockMvc
    • Spring REST Docs과 같이 쓰기 좋다.
    • 테스트 실행 비용이 적게 든다.
  • DDD
    • 도메인 모델과 로직에 집중할 수 있다.
  • AOP
    • 공통 기능을 분리하고, 분리한 모듈은 자신의 비즈니스 로직만 집중
    • 로깅할 때 사용. 로깅 모듈을 재사용할 수 있음
  • travis ci
    • 일단 aws code pipeline 사용. 필요하면 travis ci 사용.
    • 빌드, 테스트 위해 사용
    • aws code pipeline 대체용. 비용이 많이 들거나 설정이 잘 안되거나 등 상황이 생기면 travis ci로 대체하자
  • Grafana ( + Prometheus)
    • 데이터 시각화 도구. 로그 수집, 모니터링에 사용
    • 단점 : EC2나 다른 서버가 추가로 필요함
    • 돈이 있으면 쓰자
  • Jacoco
    • 코드 커버리지 도구
    • 다른 도구에 비해 참고 자료가 많음
  • Coveralls
    • 코드 커버리지 도구
    • travis ci랑 같이 씀
    • 시간이 남으면 써보자
  • sonarlint
    • 정적분석도구
    • 중복코드 등 코드스멜 잡는 용도
  • Spring security
    • 인증과 보안
    • 어렵다
    • 개발하다가 여유가 되면 써보자
  • Docker
    • 배포만이라도 쓰자