기술 면접(파싱 & XML & jacoco)

유요한·2024년 2월 23일
0

기술면접

목록 보기
11/27
post-thumbnail

파싱이란?

  • 파싱은 어떤 페이지(문서, html 등)에서 내가 원하는 데이터를 특정 패턴이나 순서로 추출하여 정보로 가공하는 것을 말하는 것이다. 다이아몬드가 많이 나오는 위치로 이동을 일단 한 후에 돌을 많이 캔다음에 다이아몬드만 뽑아서 보석으로 가공하는것과 비슷하다.
  • parsing은 구문 분석이라고 합니다. 문장이 이루고 있는 구성 성분을 분해하고 분해된 성분의 위계 관계를 분석하여 구조를 결정하는 것입니다. 즉, 데이터를 분해, 분석하여 원하는 형태로 조립하고 다시 빼내는 프로그램을 말한다. 웹상에서 주어진 정보를 내가 원하는 형태로 가공하여 서버에서 불러들이는 것이다.

이러한 parsing 기법은 XML parsingJSON parsing이 있다.

용도

XML은 워드 프로세싱과 같은 일반적인 생산성 도구에서 책 출판 소프트웨어 및 복잡한 응용 프로그램 구성 시스템에 이르기까지 수천 가지 애플리케이션 기본 기술입니다.


XML이란?

XML은 데이터를 저장하고 전달할 목적으로 만들어졌으며, 저장되는 데이터의 구조를 기술하기 위하고 HTML과 매우 비슷한 문자 기반의 마크업 언어이다. XML은 수 많은 응용 분야에서 데이터를 저장하고 전달하는 중요한 역할을 맡고 있습니다. 이 언어는 사람과 기계가 동시에 읽기 편한 구조로 되어 있습니다. 그러나 XML은 HTML처럼 데이터를 보여주는 것이 아닌 데이터를 저장하고 전달할 목적으로 만들어졌습니다. 또한 XML 태그는 사용자가 직접 정의할 수 있습니다.

XML 특징

  1. XML은 다른 목적의 마크업 언어를 만드는데 사용되는 다목적 마크업 언어이다.
  2. XML은 다른 시스템끼리 다양한 종류의 데이터를 손쉽게 교환할 수 있도록 해줍니다.
  3. XML은 새로운 태그를 만들어 추가해도 계속해서 동작하므로 확장성이 좋습니다.
  4. XML은 데이터를 보여주지 않고 데이터를 전달하고 저장하는 것만을 목적으로 합니다.
  5. XML은 텍스트 데이터 형식의 언어로 모든 XML 문서는 유니코드 문자로만 이루어집니다.

XML의 구성

XML의 용도는?

XML은 워드 프로세싱과 같은 일반적인 생산성 도구에서 책 출판 소프트웨어 및 복잡한 응용 프로그램 구성 시스템에 이르기까지 수천 가지 애플리케이션 기본 기술입니다.

데이터 전송
XML을 사용하여 동일한 데이터를 서로 다른 형식으로 저장하는 두 시스템 간에 데이터를 전송할 수 있습니다. 예를들어, 웹 사이트에서는 날짜를 MM/DD/YYYY 형식으로 저장하지만 회계 시스템은 날짜를 DD/MM/YYYY 형식으로 저장합니다. XML을 사용하여 웹 사이트에서 회계 시스템으로 데이터를 전송할 수 있습니다. 개발자는 다음을 자동으로 변환하는 코드를 작성할 수 있습니다.

  • 웹 사이트 데이터를 XML 형식으로
  • XML 데이터를 회계 시스템 데이터로
  • 회계 시스템 데이터를 다시 XML 형식으로
  • XML 데이터를 다시 웹 사이트 데이터로

XML을 사용하면 어떤 이점이 있나요?

  1. 비즈니스 간 트랜잭션 지원
    회사가 다른 회사에 상품이나 서비스를 판매하는 경우 두 기업은 비용, 사양 및 배송 일정과 같은 정보를 교환해야 합니다. XML(Extensible Markup Language)을 사용하면 필요한 모든 정보를 전자적으로 공유하고 사람의 개입 없이 복잡한 거래를 자동으로 성사시킬 수 있습니다.

  2. 데이터 무결성 유지
    XML을 사용하면 데이터 설명과 함께 데이터를 전송하여 데이터 무결성 손실을 방지할 수 있습니다. 이 설명 정보를 사용하여 다음을 수행할 수 있습니다.

  • 데이터 정확성 확인
  • 다양한 사용자를 위해 자동으로 데이터 표시 사용자 지정
  • 여러 플랫폼에 걸쳐 일관되게 데이터 저장
  1. 검색 효율성 향상
    검색 엔진과 같은 컴퓨터 프로그램은 다른 유형의 문서보다 더 효율적이고 정확하게 XML 파일을 정렬하고 분류할 수 있습니다. 예를 들어, mark라는 단어는 명사일 수도, 동사일 수도 있습니다. XML 태그를 기반으로 검색 엔진은 관련 검색 결과에 대해 mark를 정확하게 분류할 수 있습니다. 따라서 XML은 컴퓨터가 자연어를 보다 효율적으로 해석할 수 있도록 합니다.

  2. 유연한 애플리케이션 설계
    XML을 사용하면 애플리케이션 디자인을 편리하게 업그레이드하거나 수정할 수 있습니다. 많은 기술, 특히 최신 기술에는 기본 제공 XML 지원이 함께 제공됩니다. XML 데이터 파일을 자동으로 읽고 처리할 수 있으므로 전체 데이터베이스를 다시 포맷하지 않고도 변경할 수 있습니다.


Jacoco

Java code coverage의 약자로, Junit 테스트의 결과를 바탕으로 코드 커버리지 결과를 리포트 해주는 툴이다. 테스트 코드는 개발 시간을 굉장히 단축시켜주는 강력한 도구입니다. 테스트 코드 작성을 꼼꼼히 해야하는데, 이를 강제해주는 좋은 라이브러리입니다.

테스트 코드가 현재 프로덕션코드의 얼마만큼 작성되었는지 퍼센테이지로 확인하도록 해주는 라이브러리 입니다. 만약 커버리지가 100퍼센트라면, 모든 프로덕션 코드에 대해서 테스트 코드가 작성되어 있는 상태라고 할 수 있을 것 입니다.

심지어 JaCoCo는 이렇게 커버리지 결과를 알려줄뿐만 아니라, 해당 커버리지가 사용자가 설정한 퍼센테이지에 미치지 못하면 build자체가 되지않게 설정하여, 테스트코드 작성을 강제합니다.

코드 커버리지

테스트 케이스가 얼마나 충분한가를 나타내는 지표로, 테스트를 진행하였을 때 코드 자체가 얼마나 실행되었는지에 대한 수치이다.

추가하기

uild.gradle에 JaCoCo를 설정해 줍니다. plugins부분에 아래와 같은 부분을 추가해주면, Gradle이 알아서 해당 의존성을 추가해줍니다.

plugins {
	id 'jacoco'
}

JaCoCo의 의존성을 추가하고 나면 별도의 설정이 필요한데 커버리지의 퍼센테이지를 설정하고, 해당 리포트를 어떤 형식으로 저장할 지를 설정해주어야 합니다.

jacocoTestReport {
  reports {
    html.enabled true
    xml.enabled false
    csv.enabled false

// 리포트의 저장 경로를 설정합니다.
html.destination file("jacoco/jacocoHtml")
xml.destination file("jacoco/jacoco.xml")
  }
}

jacocoTestCoverageVerification {
  
  violationRules { // 커버리지의 범위와 퍼센테이지를 설정합니다.
    rule {
      element = 'CLASS'

      limit {
        counter = 'BRANCH'
        value = 'COVEREDRATIO'
        // 90%를 통과해야 빌드가 된다.
        minimum = 0.90
      }
    }
  }
}

이렇게 하면 JaCoCo가 추가되는데, 오른쪽에 있는 gradle탭을 눌러 Tasks > Verification에 들어가면 아래와 같은 jcocoTestReport와 jacocoTestCoverageVerification 명령이 생긴 것을 확인 할 수 있습니다.

여기서 테스트를 해서 실패를 하고 설정한 기댓값에 미치지 못하면 jacocoTestCoverageVerification 명령을 실행시키면, 에러가 뜨며 해당 명령이 정상적으로 실행되지 않았다고 나올 것 입니다.

에러를 읽어보면, 우리의 테스트코드는 현재 0.33의 커버리지를 갖고있는데, 커버리지 기댓값은 0.90이라고 나와있습니다.
앞서 말했던대로, JaCoCo는 우리가 설정해둔 커버리지 값에 테스트 코드가 미치지 못하면 빌드 자체를 에러를 띄웁니다.

그럼 아까 build.gradle 파일에서 jcocoTestReport에 설정해준 경로,

html.destination file("jacoco/jacocoHtml")

에 생성된 index.html 파일을 열어 자세한 정보를 알아보겠습니다.

index.html 파일을 원하는 브라우저로 열면, 커버리지 퍼센트를 확인 할 수 있습니다. (인텔리제이의 경우 오른쪽 위에 뜨는 팝업에서 브라우저를 누르면 바로 열 수 있습니다.)

혹여 테스트가 불가능 하거나, 위 JacocoApplication 파일처럼 테스트가 필요하지 않은 부분을 커버리지에서 제외해야 할 경우가 있으니, 이를 커버리지에 포함 시키지 않는 방법도 알아보도록 하겠습니다.

@Generated
@SpringBootApplication
public class JacocoApplication {

	public static void main(String[] args) {
		SpringApplication.run(JacocoApplication.class, args);
	}

}

Lombok 라이브러리의 Generated 어노테이션을 붙이면, 해당 클래스를 커버리지에서 제외합니다. 메서드 위에 붙여도 동일하게 작동합니다.

profile
발전하기 위한 공부

0개의 댓글