블로그

JUnit 5를 위한 메서드 및 클래스 가시성 수정

December 21, 2020
앨런 리처드슨

JUnit 5를 위한 메서드 및 클래스 가시성 수정

프로그래밍의 즐거움 중 하나는 최신 기술을 유지하기 위해 끊임없이 학습해야 한다는 점입니다. 한 가지 문제는 우리가 익숙한 방식과 사용 패턴을 고수하게 되어 새로운 접근 방식을 도입하는 데 방해가 될 수 있다는 것입니다. Sensei는 더 이상 사용되지 않는 패턴을 식별하고 향후 사용할 수정 사항을 제안함으로써 마이그레이션을 도울 수 있습니다.

예를 들어, JUnit 4에서 JUnit 5로 마이그레이션할 때 저는 모든 테스트 클래스와 메서드를 public으로 작성하는 데 익숙했습니다. 하지만 JUnit 5에서는 패키지 전용(package private)으로 설정할 수 있습니다.

예: 다음 대신:

public class Junit5VisibilityTest {
    @Test
    public void thisDoesNotNeedToBePublic(){
        Assertions.assertTrue(true);
    }
}


저는 다음과 같이 작성하고 싶습니다:

class Junit5VisibilityTest {
    @Test
    void thisDoesNotNeedToBePublic(){
        Assertions.assertTrue(true);
    }
}


이 방식에 익숙해지는 데 시간이 좀 걸렸고, 여전히 가끔 실수하곤 합니다.

Sensei 사용하기

Sensei를 사용하면 public 메서드와 클래스를 찾아 선언을 자동으로 패키지 전용으로 수정하는 레시피를 만들 수 있습니다.

이를 위해 다음과 같은 레시피를 만들었습니다:

이름 - JUnit: JUnit 5 테스트 메서드는 public일 필요가 없습니다
설명 - JUnit 5 테스트 메서드는 public 가시성이 필요하지 않습니다
수준 - 오류


이러한 코딩 관행을 없애고 IDE에서 코드를 작성할 때 해당 문제를 더 명확하게 확인하고 싶었기 때문에 이를 '오류' 수준으로 분류했습니다.

클래스 선언 수정

클래스를 찾기 위해 JUnit 5의 @Test(org.junit.jupiter.api.Test) 어노테이션을 하위 요소로 가진 모든 클래스를 검색합니다.

그리고 클래스에 public 수정자가 있는 경우:

검색:
  클래스:
    포함:
      하위:
        어노테이션:
          유형: "org.junit.jupiter.api.Test"
  수정자: "public"

그러면 퀵 픽스(Quick Fix)가 수정자를 변경하여 가시성을 제거하고 기본값으로 설정합니다. 기본값은 패키지 프라이빗(package private)이며, 제가 의도한 바가 바로 이것입니다.

사용 가능한 수정 사항:
- 이름: "JUnit 5 테스트 클래스에서 public 가시성 제거"
  작업:
  - 수정자 변경:
      가시성: ""



메서드 선언 수정하기

메서드 선언 수정 레시피는 클래스 레시피와 거의 동일합니다.

먼저 JUnit 5의 @Test 어노테이션이 지정된 public 메서드를 검색합니다.

검색:
  메서드:
    어노테이션:
      유형: "org.junit.jupiter.api.Test"
    수정자: "public"


그런 다음 수정자를 기본 가시성으로 변경합니다.

사용 가능한 수정 사항:
- 이름: "@Test 메서드의 public 가시성 제거"
  작업:
  - 수정자 변경:
      가시성: ""


팁: 여러 메서드 한꺼번에 수정하기

Sensei는 현재 파일에 있는 모든 위반 사항에 퀵 픽스를 적용하는 기능을 제공합니다.

alt+enter를 사용하여 퀵 픽스를 적용할 때입니다.

퀵 픽스 이름 메뉴를 확장하면 다음과 같은 옵션을 볼 수 있습니다.

"파일 내 'JUnit: JUnit 5 테스트 메서드는 public일 필요가 없음' 문제 모두 수정"

해당 옵션을 선택하면 Sensei는 선택한 항목뿐만 아니라 파일 내의 모든 문제 발생 지점을 수정합니다.


Remove Test Method Public Visibility

클래스 수정하기

메서드가 public일 필요가 없는 것과 마찬가지로, 클래스도 public일 필요가 없습니다.

레시피와 퀵 픽스를 생성하여 클래스를 수정할 수 있습니다.

이름 - JUnit: JUnit 5 테스트 클래스는 public일 필요가 없음
설명 - JUnit 5 테스트 클래스는 public일 필요가 없음
수준 - 오류


public이면서 @Test 어노테이션이 지정된 메서드를 포함하는 클래스를 찾으면, 가시성을 변경하려고 합니다.

search:
  class:
    modifier: "public"
    anyOf:
    - child:
        method:
          annotation:
            type: "Test"


changeModifiers 액션을 사용하여 클래스 정의를 다시 변경할 수 있습니다.

availableFixes:
- name: "@Test 클래스의 public 가시성 제거"
  actions:  
- changeModifiers:
      visibility: ""


요약

정적 분석 도구를 통해 JUnit에서 권장하는 이 접근 방식을 처음 알게 되었습니다. 하지만 정적 분석 도구만으로는 코딩하면서 습관적으로 코드를 변경하는 근육 기억을 만드는 데 한계가 있었습니다.

'Level'을 사용하여 알림을 받아보세요. 고치고 싶은 코딩 습관이 있다면 처음에는 'Error'로 설정했다가, 점차 익숙해지면서 단계를 낮춰가는 방식을 추천합니다.

QuickFix를 적용할 때 드롭다운 메뉴 옵션을 사용하면 현재 파일의 모든 문제를 한 번에 해결할 수 있다는 점을 기억하세요.

Sensei 레시피를 만들면 실시간으로 기존 코딩 방식을 확인할 수 있습니다. 가끔 코딩하다 실수하더라도 QuickFix를 통해 올바른 방식을 다시 익힐 수 있습니다.

---

IntelliJ의 "Preferences \ Plugins"(Mac) 또는 "Settings \ Plugins"(Windows)에서 "sensei secure code"를 검색하여 Sensei를 설치할 수 있습니다.

이와 관련된 소스 코드와 레시피는 Secure Code Warrior GitHub 계정의 `sensei-blog-examples` 저장소 내 `junitexamples` 모듈에서 확인할 수 있습니다.



태그라인

배포 전 AI 기반 개발 거버넌스 확보

AI 기반 위험을 측정하고, 커밋 시점에 보안 코딩 정책을 적용하며, SDLC 전반에 걸쳐 안전한 소프트웨어 제공 속도를 높이세요.

데모 예약하기
리소스 라이브러리

더 많은 블로그 살펴보기

보안 코딩, AI 거버넌스, 소프트웨어 리스크 관리에 관한 전문가 콘텐츠를 확인해 보세요.

전체 보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

더 알아보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

더 알아보기
사례 연구
필터 라벨
div 블록 내부의 텍스트입니다.

하나의 보안 문화: Sage는 어떻게 챔피언 프로그램을 구축했는가

Sage가 유연하고 관계 중심적인 접근 방식을 통해 보안을 강화하고, 200명 이상의 보안 챔피언을 양성하며 실질적인 위험 감소를 달성한 사례를 확인해 보세요.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

2026년 사이버 보안 인식의 달: 기업 방어의 핵심, AI 보안 이해하기

주요 AI 기업 대부분이 안전 가이드라인이 마련될 때까지 AI 개발 속도를 전 세계적으로 늦춰야 한다고 공개적으로 촉구하는 시점에 이르렀지만, 사실 심각한 보안 문제는 이미 현실화되었습니다. 이로 인해 AI 도입에 따른 금전적 비용과 위험 부담이 계속 쌓이면서 수많은 보안 책임자와 경영진이 절박한 상황에 놓였습니다.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

인에이블러 8: 프로그램 브랜딩

성공적인 보안 코딩 프로그램을 위해서는 훌륭한 콘텐츠 그 이상의 것이 필요합니다. 인에이블러 8에서는 브랜딩을 통해 참여를 누구나 선망하는 위상 중심의 경험으로 바꾸는 방법을 알아봅니다.

더 알아보기
블로그
필터 라벨
div 블록 내부의 텍스트입니다.

이제 모든 직원이 AI 사이버 보안의 최전선에 있습니다

엔터프라이즈 기술 환경은 너무 늦기 전까지는 아무도 예상하지 못한 속도로 변화하고 있습니다. 우리는 공식적으로 사람이 직접 작성한 코드와 기본적인 코파일럿 지원의 시대를 지나 '에이전트 기반 개발 수명 주기(ADLC)'의 시대로 진입했습니다. 자율형 AI 에이전트는 여러 기능 전반에 걸쳐 전례 없는 효율성을 약속하지만, 동시에 완전히 새로운 차원의 보안 및 규제 위험을 야기합니다.

더 알아보기

배포 전 AI 기반 개발 보안 확보

소프트웨어 개발 수명 주기 전반에서 개발자 리스크를 파악하고, 정책을 시행하며, 취약점을 예방하세요.

데모 예약하기
항목이 없습니다.