리눅스 콘솔로 소스코드 검색하기 (2)

Posted by 김순철 on April 15, 2018

리눅스 콘솔로 소스코드 검색하기 (2)

지난 번에 리눅스 콘솔로 소스코드를 검색하는 방법을 알아보았습니다. 내용을 다시 상기시켜 보겠습니다.

아래 명령어를 조합하여 원하는 코드 라인을 찾아냈습니다.

$ find ./ -iname '*.java' | xargs grep -in 'autowired'

코드를 찾은 후 필요 없는 부분은 아래 명령어로 제거해 나갔습니다.

$ find ./ -iname '*.java' | xargs grep -in 'autowired' | grep -vi 'String.*='

프롤로그

코드를 보다보면 이런 경우가 있습니다.

  1. 작성한 클래스에 어떤 어노테이션이 적용 되어있는지 알고 싶다.
  2. RequestMapping 을 걸어둔 컨트롤러의 진짜 메소드명을 알고 싶다.
  3. MyBatis 전체 XML에서 특정한 컬럼을 사용하는 MyBatis Mapper ID를 알고 싶다.

이럴 때 grep 에 편리한 옵셥을 제공합니다. 아래를 보시죠.

자, 같이 실습을 해보면서 알아 보겠습니다.

아래와 같은 순서로 진행하겠습니다.

  1. 리눅스 터미널 설치 (생략 가능)
  2. Git 설치하기 (생략 가능)
  3. 소스 받기
  4. 소스에서 검색해보기

1. 리눅스 터미널 설치 (생략 가능)

우선 윈도우에서 리눅스 환경이 없으신 분들은 아래 프로그램을 받으시기 바랍니다.

  • https://mobaxterm.mobatek.net/download-home-edition.html

터미널 프로그램이지만 Cygwin 터미널을 내장하고 있어 윈도우에서도 편하게 리눅스를 사용할 수 있습니다. 실행을 하면 아래와 같은 화면이 나옵니다. Start local terminal을 클릭하면 로컬 리눅스 터미널이 실행 됩니다.

2. Git 설치하기 (생략 가능)

아래 코드를 입력하여 git을 설치합니다. 데비안/우분투 기준이며 레드헷 계열이나 나머지 환경은 검색을 통해 확인해보시기 바랍니다. 윈도우의 MobaXTerm에서도 아래 명령어로 설치 가능합니다.

$ apt-get install git

3. 소스 받아오기

자바 카페의 게시판 소스로 실습을 해보겠습니다.

$ git clone https://github.com/KEUMSUNGHYUN/javacafe-study-springboot.git

4. 소스에서 검색해보기

받은 디렉토리로 이동합니다.

$ cd javacafe-study-springboot

4-1. @RequestMapping의 실제 메소드명 알아내기

우선 @RequestMapping이 되어있는 항목을 찾아봅니다. @RequestMapping의 경우 @GetMapping, @PostMapping을 사용할 수도 있으므로 Mapping이란 단어로 검색해 보겠습니다.

$ find ./ -iname '*.java' | xargs grep -n 'Mapping'

아래와 같이 3개가 검색 됩니다.

무의미하지만 실습을 위해 @RequestMapping 바로 아래의 메소드명을 확인해 봅니다. -A1 옵션을 추가해 봅니다.

$ find ./ -iname '*.java' | xargs grep -in -A1 'Mapping'

결과를 보니 검색된 결과의 다음 바로 라인까지 보여줍니다.

-A<숫자> 를 사용하면 숫자만큼 아래 라인을 같이 출력해줍니다. **-A5**라고 쓰는 경우 하위 5개 라인을 모두 출력합니다. **-B<숫자>** 옵션을 쓰는 경우는 검색된 라인의 위쪽 소스를 출력해 줍니다.

아래와 같이 -A, -B 옵션을 같이 사용하고 싶은 경우는 -C 옵션을 사용하면 됩니다. -C 옵션의 경우는 위,아래 동일한 라인을 출력 해줍니다.

$ find ./ -iname '*.java' | xargs grep -in -C3 'Mapping'

4-2. 클래스에 명시된 Annotation 보기

위에서 RequestMapping을 찾는 방법과 동일합니다. 클래스의 경우는 class <클래스명>으로 시작되므로 아래와 같이 검색이 가능합니다. 좀 더 정확한 검색을 위해 class 뒤에 공백을 포함하였습니다.

$ find ./ -iname '*.java' | xargs grep -n 'class '

아래와 같이 나옵니다.

Annotation은 클래스 위에 존재하므로 -B 옵션을 사용해 보겠습니다. Annotation이 얼마나 있는지 모르므로 적당히 5라인 위까지 살펴보겠습니다.

$ find ./ -iname '*.java' | xargs grep -n -B5 'class '

아래 결과를 보면 각 클래스에 여러 Annotation이 있는 것을 볼 수가 있습니다.

여기까지 grep의 -A, -B, -C 옵션을 알아 보았습니다.

저는 전체 소스에서 원하는 부분을 추적해 갈 때 굉장히 자주 쓰고 있습니다. 오늘 예제는 소스가 길지 않아 명령어의 장점이 쉽게 드러나지 않지만, 실무에서는 도움이 될 것이라 생각 됩니다.

이상으로 글을 마치겠습니다. 감사합니다.