Spring 프로젝트나 레거시 프로젝트를 분석하다 보면 "이 클래스가 어디서 사용되고 있지?", "이 메서드는 몇 군데에서 호출되고 있지?"를 자주 확인하게 됩니다.

많은 개발자들이 IntelliJ의 사용처(Usage) 표시 기능을 편하게 사용하고 있는데, 사실 Eclipse도 비슷한 기능을 제공합니다.

이번 글에서는 Eclipse에서 클래스와 메서드의 사용처를 추적하는 방법을 정리해보겠습니다.


1. 클래스·메서드 참조 개수 표시하기 (Code Mining)

IntelliJ에서는 메서드 위에 다음과 같은 정보가 표시됩니다.

5 usages
3 implementations
 

Eclipse에서도 동일한 기능을 사용할 수 있습니다.

설정 방법

Window
→ Preferences
→ Java
→ Editor
→ Code Mining
 

다음 항목을 활성화합니다.

✓ References
✓ Implementations
 

설정 후에는 메서드나 클래스 위에 다음과 같은 정보가 표시됩니다.

3 references
2 implementations
 

이를 통해 별도의 검색 없이도 사용 빈도를 빠르게 확인할 수 있습니다.


2. 사용처 찾기 (Find References)

특정 클래스나 메서드가 프로젝트 내에서 어디에서 사용되는지 확인할 수 있습니다.

단축키

Ctrl + Shift + G
 

예를 들어 아래 메서드가 있다고 가정해봅시다.

 
public void sendSms() {
}
 

메서드명에 커서를 두고

Ctrl + Shift + G
 

를 누르면 Workspace 전체에서 사용된 위치가 검색됩니다.

예시

 
smsService.sendSms();
 

사용된 모든 위치가 Search View에 표시됩니다.


3. 구현체 찾기 (Type Hierarchy)

인터페이스를 구현한 클래스가 무엇인지 확인하고 싶을 때 사용합니다.

예시

 
public interface UserService {
}
 

구현체를 찾고 싶다면 다음 단축키를 사용합니다.

단축키

Ctrl + T
 

또는

F4
 

실행 결과

UserServiceImpl
AdminUserServiceImpl
MemberUserServiceImpl
 

처럼 인터페이스를 구현한 클래스 목록을 확인할 수 있습니다.


4. 메서드 호출 계층 분석 (Call Hierarchy)

특정 메서드가 어떤 흐름으로 호출되는지 추적할 때 매우 유용합니다.

단축키

Ctrl + Alt + H
 

예시

 
public void sendSms() {
}
 

호출 계층을 열면 다음과 같이 표시됩니다.

회원가입
 └ sendSms()

비밀번호 찾기
 └ sendSms()

알림 발송
 └ sendSms()
 

단순히 검색 결과를 나열하는 것이 아니라 호출 관계를 트리 형태로 보여주기 때문에 코드 분석 속도가 크게 향상됩니다.


5. 선언부로 이동하기

사용 중인 클래스나 메서드의 선언 위치로 바로 이동할 수 있습니다.

단축키

F3
 

예시

 
smsService.sendSms();
 

sendSms 위에서 F3을 누르면 실제 선언부로 이동합니다.


6. 타입 검색하기

프로젝트 전체에서 원하는 클래스를 빠르게 찾을 수 있습니다.

단축키

Ctrl + Shift + T
 

예시

SmsService
UserController
LoginService
 

클래스명이 기억나지 않아도 일부만 입력해도 검색 가능합니다.


7. 동일 변수·메서드 하이라이트

현재 선택한 변수나 메서드가 같은 파일 내에서 어디에 사용되는지 시각적으로 확인할 수 있습니다.

설정 방법

Window
→ Preferences
→ Java
→ Editor
→ Mark Occurrences
 

다음 옵션 활성화

✓ Mark occurrences of selected element
 

설정 후 변수 클릭 시 동일한 변수들이 자동으로 강조 표시됩니다.

예시

 
String userId;
userId = "admin";
System.out.println(userId);
 

userId를 클릭하면 같은 변수들이 모두 하이라이트됩니다.


Spring 프로젝트 분석 시 필수 단축키

기능단축키
선언부 이동 F3
사용처 찾기 Ctrl + Shift + G
구현체 찾기 Ctrl + T
호출 계층 보기 Ctrl + Alt + H
클래스 검색 Ctrl + Shift + T

마무리

많은 개발자들이 IntelliJ의 코드 탐색 기능을 선호하지만, Eclipse 역시 강력한 코드 분석 기능을 기본 제공합니다.

특히 Spring 프로젝트나 레거시 유지보수 업무에서는 아래 5가지만 익혀도 대부분의 코드 추적이 가능합니다.

  • F3 : 선언부 이동
  • Ctrl + Shift + G : 사용처 찾기
  • Ctrl + T : 구현체 찾기
  • Ctrl + Alt + H : 호출 계층 분석
  • Ctrl + Shift + T : 클래스 검색

레거시 프로젝트를 분석할 때 가장 많이 사용하는 기능들이므로 꼭 익혀두는 것을 추천합니다. 

spring boot 프로젝트에서 간단하게 exe 파일을 만드는 방법

 

1. 테스트 프로젝트 환경

Spring boot 3.5

gradle

package 설정 :  jar

 

2. jar 파일 만들기

프로젝트 root에 gradlew를 사용하고 pc에 설치된 java하고 빌드 할 java 버전이 다르면 java버전 지정 해준다.

./gradlew clean bootJar "-Dorg.gradle.java.home=C:\Program Files\Java\OpenJDK21U-jdk_x64_windows_hotspot_21.0.10_7\jdk-21.0.10+7"

 

위 명령어는 인텔리제이 콘솔에서 실행 가능

 

3. exe 만들기

cmd에서 프로젝트 root 경로로 이동해서 실행 

"C:\Program Files\Java\OpenJDK21U-jdk_x64_windows_hotspot_21.0.10_7\jdk-21.0.10+7\bin\jpackage.exe" ^
  --type app-image ^
  --name imh ^
  --input build\libs ^
  --main-jar demo-0.0.1-SNAPSHOT.jar ^
  --main-class org.springframework.boot.loader.launch.JarLauncher ^
  --dest installer

 

"C:\Program Files\Java\...\bin\jpackage.exe" ^
 

JDK 21에 포함된 jpackage.exe를 직접 실행합니다.
경로에 공백이 있어서 따옴표가 필요합니다.

 
--type app-image ^
 

설치파일이 아니라 실행 가능한 프로그램 폴더를 만듭니다.

installer/imh/imh.exe
installer/imh/runtime/
installer/imh/app/
 

형태로 생성됩니다.

 
--name imh ^
 

프로그램 이름입니다.
결과 exe 이름도 보통 imh.exe가 됩니다.

 
--input build\libs ^
 

실행할 JAR 파일이 들어있는 폴더 위치입니다.

 
--main-jar demo-0.0.1-SNAPSHOT.jar ^
 

실제로 실행할 Spring Boot JAR 파일 이름입니다.

 
--main-class org.springframework.boot.loader.launch.JarLauncher ^
 

Spring Boot 실행용 메인 클래스입니다.
bootJar로 만든 JAR는 이 클래스를 통해 실행됩니다.

 
--dest installer
 

결과물을 만들 위치입니다.

최종 결과: 프로젝트 root 하위에 생성됨

installer/
└─ imh/
   ├─ imh.exe
   ├─ app/
   └─ runtime/
 

다른 PC에 배포할 때는 installer/imh 폴더 전체를 압축해서 보내면 됩니다.



 

1. Redis

redis-cli -h  <서버아이피> -p <포트>

접속

 

redis-cli -a <패스워드> --scan --pattern "spring:session:*" | xargs redis-cli -a <패스워드> del

spring session 전체 삭제

 

KEYS spring:session:*

spring session 키 조회

 

 

2. 도커 Docker

docker ps

도커 목로

 

docker exec -it 이미지이름 bash

도커 이미지 접속

 

3. Port 관련

ss -tlnp | grep :<포트>

특정 포트 상태 조회

 

4. Linux

ln -s 실제경로 심볼릭폴더이름

심볼릭 설정

 

5. Nginx

./nginx -t

nginx 설정 체크

 

./nginx -s reload

nginx 재시작

 

./nginx -s stop

nginx 중지

 

./nginx

nginx 시작

 

 

지속적으로 중간중간 업데이트 에정

'Development Story > Linux' 카테고리의 다른 글

리눅스 스레드 덤프  (0) 2026.02.04
pcap 동작 원리  (0) 2024.08.29
nginx 수동 설치 재기동  (0) 2024.08.19
Linux Maven 설치  (0) 2024.03.04
Linux Java(jdk) 설치  (0) 2024.03.04

1. nexus 다운로드

https://help.sonatype.com/en/download-archives---repository-manager-3.html

 

Download Archives - Sonatype Nexus Repository 3

Download Archives - Sonatype Nexus Repository 3Sonatype Nexus RepositoryTM is always rapidly evolving; we discourage using older versions.Docker images for Sonatype Nexus RepositoryTM are available on Docker Hub.Information about deployment templates is fo

help.sonatype.com

링크에서 윈도우 버전을 다운로드 한다.

 

2. 다운로드한 압축파일을 설치하려는 폴더로 옴겨서 압축을 해제한다.

예시) C:\nexus\nexus-3.90.1-01-win-x86_64

 

3. nexus 서비스 등록

압축푼 경로에 C:\nexus\nexus-3.90.1-01-win-x86_64\nexus-3.90.1-01\bin\install-nexus-service.bat 을 실행하면 서비스를 자동 등록 할 수가 있다.

install-nexus-service.bat  파일을 더블클릭하면 cmd 창이 열리고 서비스를 등록할건지 묻는 화면이 나오면 Y를 치고 엔터

 

3. 서비스 등록 확인

서비스 설정창을 다시 열고 Sonatype Nexus Repository  서비스가 등록되어 있는지 확인 한다.

 

4. 넥서스 서비스 포트 설정

C:\nexus\nexus-3.90.1-01-win-x86_64\nexus-3.90.1-01\etc\nexus-default.properties 를 메모장으로 열어서 application-port를 원하는 포트로 설정

## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
##
# Jetty section
application-port=8090
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
nexus-context-path=/

 

5. 서비스 실행

서비스 설정에서 등록된 서비스 Sonatype Nexus Repository 를 시작버튼을 눌러서 서비스 실행

 

6. nexus 초기 설정

브라우저에서 localhost 또는 넥서스 서버 ip의 설정한 포트로 nexus를 열면 로그인 창이 나온다.

로컬에서 열때  - http://localhost:8090

 

초기 비밀번호는 첫화면에 나와있는 경로의 admin.password 파일을 메모장으로 열어서 확인하고 로그인

 

 

신규패스워드 설정

 

 

 

계정없이 repositories에 접근 가능 여부 설정을 Enable로 설정해야 계정없이 저장소 접근이 가능함

 

 

7. Connection/Socket Timeout 설정

넥서스 서버가 외부에서 라이브러리를 다운로드 시간이 오래 걸리면 500에러가 발생하기 때문에 Connection/Socket Timeout과 Connection/Socket Retry Attempts 설정을 수정한다.

Settings > System > HTTP

1. 검색에서 서비스 설정창을 열어서 서비스를 확인하고 중지한다.

cmd에서 중지 하는법 (관리자권한으로 cmd오픈)

sc stop "서비스명"

 

2. 서비스 삭제

sc delete "서비스명"

 

3. 서비스 설정창을 닫고 다시 열어보면 목록에서 사라짐

'Development Story > Windows' 카테고리의 다른 글

윈도우 폴더 백업  (0) 2025.12.24

1. JVM PID 찾기

jps -l

 

2. 스레드 덤프 뜨기

jstack PID값 > threaddump.txt

 

3. 서버에 jstack이 없을 때

jcmd PID값 Thread.print > threaddump.txt

 

4. 강제 덤프 ( 콘솔 로그(stdout)에 스레드 덤프가 찍힘, 콘솔 로그(stdout)에 스레드 덤프가 찍힘)

kill -3 12345

 

5. 덤프 파일 보는 법

 

  • BLOCKED / WAITING 상태 우선 체크
  • 같은 위치에서 멈춘 스레드가 여러 개?
  • Controller Boot Thread가 무엇을 기다리는지
  • 스케줄러 스레드가 락을 잡고 있는지

 

'Development Story > Linux' 카테고리의 다른 글

리눅스(Linux) 명령어 모음  (0) 2026.04.08
pcap 동작 원리  (0) 2024.08.29
nginx 수동 설치 재기동  (0) 2024.08.19
Linux Maven 설치  (0) 2024.03.04
Linux Java(jdk) 설치  (0) 2024.03.04

 

1. 미러

robocopy C:\work D:\backup\work /MIR /R:1 /W:1

 

  • 변경된 파일만 복사
  • 대용량/많은 파일에 매우 강함
  • MIR 옵션이 있으면 삭제도 동기화된다.

 

2. 일반 복사

robocopy "D:\대상폴더" "E:\이동될 폴더" /E /R:1 /W:1

 

 

'Development Story > Windows' 카테고리의 다른 글

윈도우 서비스 삭제  (0) 2026.03.30

1. SSL Port 443 포트 오픈

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

 

2. Certbot 설치

Let's Encrypt 를 무료로 사용 할 수 있어서 Let's Encrypt 클라이언트 설치

sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-apache -y

 

3. SSL 인증서 발급 및 설치 (자동 설정)

sudo certbot --apache -d 적용도메인 -d 적용도메인 -d 적용도메인

 

-d 옵션으로 적용 도메인을 여러게 설정을 할 수 있다.

예) sudo certbot --apache -d naver.com -d nate.com -d

 

에러 발생 처리

Saving debug log to /var/log/letsencrypt/letsencrypt.log Error while running apachectl configtest. AH00526: Syntax error on line 85 of /etc/httpd/conf.d/ssl.conf: SSLCertificateFile: file '/etc/pki/tls/certs/localhost.crt' does not exist or is empty Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):

 

위 에러가 발생하면

sudo mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak

 

httpd의 ssl.conf를 bak로 이름을 바꿔고 시도를 해보거나 그래도 안되면 dummy SSL 인증서 생성 한다.

 

dummy SSL 인증서 생성

sudo openssl req -x509 -nodes -days 1 -newkey rsa:2048 \
  -keyout /etc/pki/tls/private/localhost.key \
  -out /etc/pki/tls/certs/localhost.crt

 

dummy SSL 인증서 생성 후 sudo certbot --apache -d 적용도메인 -d 적용도메인 -d 적용도메인 를 다시 시도하면 설치 진행이 된다.

 

설치 진행 시 인증가능한 url이 필요한데 스프링 시큐리티 등을 써서 리다이렉트가 되면 인증 실패가 발생한다.

 

인증실패

Detail: 114.207.113.9: Invalid response from ......

 

인증 실패가 발생하면 리다이렉트 되지 않는 유효한 url를 만들어줘야 한다.

 

인증경로 디렉토리 생성 / 테스트 파일 생성

sudo mkdir -p /var/www/certbot/.well-known/acme-challenge
echo "ok" | sudo tee /var/www/certbot/.well-known/acme-challenge/test.txt

 

브라우저에서 http://도메인 url/.well-known/acme-challenge/test.txt 이렇게 열었을때 페이지가 열리면 된다.

그리고 다시 sudo certbot --apache -d 적용도메인 -d 적용도메인 -d 적용도메인 명령어 실행

 

그리도 안되면 apache의 vhost 설정에서 우선순위로 인해 page가 열리지 않으 수도 있다.

그럴경우 인증경로 예외처리 설정을 해준다.

<VirtualHost *:80>
  ServerName 서버이름
  
   # 인증 경로는 리디렉션 제외
  JkUnMount /.well-known/acme-challenge/* JkMount설정명
  Alias /.well-known/acme-challenge/ /var/www/certbot/.well-known/acme-challenge/
  <Directory "/var/www/certbot/.well-known/acme-challenge/">
      AllowOverride None
      Options None
      Require all granted
  </Directory>
  
  # 인증 경로를 제외하고 HTTPS 리디렉션
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
  RewriteRule ^/?(.*) https://manager.mykabot.com/$1 [R=301,L]
  
  DocumentRoot /......경로/webapps/ROOT
  SetEnvIf REQUEST_URI "^(/resources/|/mykabot/)" no-jk
  ErrorLog logs/로그경로/error_log
  CustomLog logs/로그경로/access_log combined
  JkMount /* JkMount설정명
 
  # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
  Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>

<VirtualHost *:443>
  ServerName manager.mykabot.com
  DocumentRoot /backup/sws/app/mykabot/apache-tomcat-9.0.100/webapps/ROOT
  
  #SSL 인증서설정 
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/manager.mykabot.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/manager.mykabot.com/privkey.pem
  
   # 인증 경로 예외 (Jk 처리 제외 + 직접 서빙)
  JkUnMount /.well-known/acme-challenge/* mykabot_manager
  Alias /.well-known/acme-challenge/ /var/www/certbot/.well-known/acme-challenge/
  <Directory "/var/www/certbot/.well-known/acme-challenge/">
      AllowOverride None
      Options None
      Require all granted
  </Directory>
  
  #SetEnvIf REQUEST_URI "\.(htm|html|css|gif|jpg|js|mp3|mp4)$" no-jk
  SetEnvIf REQUEST_URI "^(/resources/|/mykabot/)" no-jk
  ErrorLog logs/mykabot-manager-log/error_log
  CustomLog logs/로그경로/access_log combined
  JkMount /* JkMount설정명
   
  # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
  Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>

 

프록시 사용하는 경우

<VirtualHost *:80>  
    ServerAlias jenkins.mykabot.com
    
    # ? 프록시 제외 먼저
    ProxyPass /.well-known/acme-challenge/ !
    
     # 인증 경로는 리디렉션 제외
    Alias /.well-known/acme-challenge/ /var/www/certbot/.well-known/acme-challenge/
    <Directory "/var/www/certbot/.well-known/acme-challenge/">
        AllowOverride None
        Options None
        Require all granted
    </Directory>
    
    # 인증 경로를 제외하고 HTTPS 리디렉션
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
    RewriteRule ^/?(.*) https://도메인/$1 [R=301,L]
    
    ErrorLog logs/jenkins_log/error_log
    CustomLog logs/jenkins_log/access_log combined
    Header always set Strict-Transport-Security "max-age=63072000"
    ProxyPreserveHost on
    ProxyPass / http://localhost:9001/
    ProxyPassReverse / http://localhost:9001/
    ProxyTimeout 3600
</VirtualHost>

<VirtualHost *:443>  
    ServerAlias jenkins.mykabot.com
    
    #SSL 인증서 설정
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/manager.mykabot.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/manager.mykabot.com/privkey.pem
    
    # 인증 경로 예외 먼저 선언
    ProxyPass /.well-known/acme-challenge/ !
    
    Alias /.well-known/acme-challenge/ /var/www/certbot/.well-known/acme-challenge/
    <Directory "/var/www/certbot/.well-known/acme-challenge/">
        AllowOverride None
        Options None
        Require all granted
    </Directory>
    
    ErrorLog logs/로그경로/error_log
    CustomLog logs/로그경로/access_log combined
    Header always set Strict-Transport-Security "max-age=63072000"
    ProxyPreserveHost on
    ProxyPass / http://localhost:9001/
    ProxyPassReverse / http://localhost:9001/
    ProxyTimeout 3600
</VirtualHost>

 

설정 후 적용 명령어 재실행

sudo apachectl configtest  
# "Syntax OK" 확인
sudo systemctl restart httpd

# 저장 오류시 sudo setenforce 0 으로 변경 후 저장

sudo certbot --apache -d 적용도메인 -d 적용도메인 -d 적용도메인

 

웹페이지에서 https로 열리지 않으면 ssl.conf.bak 원복

sudo mv /etc/httpd/conf.d/ssl.conf.bak /etc/httpd/conf.d/ssl.conf

sudo apachectl configtest
# → 반드시 "Syntax OK" 나와야 합니다.

sudo systemctl restart httpd

 

4. Let's Encrypt 자동 갱신

기본적으로 Certbot 설치 시 자동으로 cron 또는 systemd timer로 갱신이 설정

 

sudo systemctl list-timers | grep certbot

#결과
certbot.timer     certbot.service     ...     Mon 03:00:00
하루 2번 certbot renew가 자동 실행되며, 만료 30일 이내일 경우 갱신 시도합니다.

결과가 없으면 수동 등
sudo crontab -e

내용 추가 -> 0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload httpd"

sudo crontab -l

 

자동갱신 테스트

sudo certbot renew --dry-run

 

 

인증서 만료확인

sudo openssl x509 -in /etc/letsencrypt/live/manager.mykabot.com/cert.pem -noout -enddate

'Development Story > Apache' 카테고리의 다른 글

centos apache가 start가 안될때  (0) 2024.03.04

+ Recent posts