CRUD 분석과 테이블 영향도 - Bottom-Up 분석의 힘
·
토스 러너스하이 2기/기술
"이 테이블 스키마 바꾸면 어떤 API가 영향받아?"실무에서 이런 질문을 받았다. 기존 Top-Down 분석(URL→SQL)으로는 답할 수 없었다. 테이블에서 코드를 역추적하는 Bottom-Up 분석을 구현한 이야기.3줄 요약Top-Down(URL→SQL)과 Bottom-Up(테이블→코드)은 상호보완적이다역방향 인덱싱(Map>)으로 O(1) 조회 가능하게 구현했다GUI에서 드릴다운 UX는 CardLayout + 브레드크럼 패턴으로 해결한다1. 들어가며기술 1편부터 지금까지 Top-Down 분석을 구현했다:Top-Down 분석:URL → Controller → Service → DAO → SQL"이 API는 어떤 테이블을 조회하나?"라는 질문에 완벽하게 답할 수 있었다.그런데 실무에서 반대 방향 질문을 받..
Gson으로 세션 영속성 구현하기 - 앱을 닫아도 분석 결과가 살아있다
·
토스 러너스하이 2기/기술
"분석 완료! 결과 확인! ...앱 종료. 다시 실행하면? 처음부터 다시?"그게 싫었다. 분석 결과를 저장해서 다시 열어도 그대로 보고 싶었다. Gson으로 세션 영속성을 구현하면서 배운 것들.3줄 요약Gson은 한 줄로 Java 객체를 JSON으로 변환하는 가벼운 라이브러리다LocalDateTime 같은 Java 8+ 타입은 TypeAdapter를 직접 구현해야 한다저장 방식을 통합하지 않으면 이중 저장이라는 기술 부채가 생긴다1. 들어가며이전 글에서 Swing GUI를 완성했다. 폴더 선택, 분석 실행, 결과 확인까지 깔끔하게 동작했다.그런데 하나 빠진 게 있었다.사용 시나리오:1. 앱 실행2. 프로젝트 폴더 선택3. 분석 실행 (30초 소요)4. 결과 확인5. 앱 종료6. 다음 날, 앱 다시 실행7..
jpackage로 배포하기 - 폐쇄망에서 Java 없이 실행하기
·
토스 러너스하이 2기/기술
"폐쇄망에서 이거 쓰려면 JDK 따로 구해서 환경변수 설정하고..."그 과정이 싫었다. 사용자들은 그냥 exe 하나로 끝내게 하고 싶었다. jpackage로 JRE를 통째로 번들링하면서 겪은 삽질들.3줄 요약jpackage는 JDK 14+에 내장된 배포 도구로, JRE 포함 설치파일을 만들 수 있다Windows exe 생성에는 WiX Toolset이 필요한데, JDK 21은 WiX 3.x만 지원한다인코딩 지옥을 피하려면 description은 영문으로, exe 실행 문제는 --arguments로 해결한다1. 들어가며이전 글에서 Swing GUI를 완성했다.FlatLaf로 다크 테마를 입히고, SwingWorker로 분석을 백그라운드에서 돌리고, 설정도 저장되게 만들었다.이제 남은 건 배포다.문제: 폐쇄망..
Swing으로 모던한 GUI 만들기 - CLI를 넘어서
·
토스 러너스하이 2기/기술
"명령어로 해야하는건 접근성이 좀 떨어지는데.. 비개발자도 쓸 수 있어야 하지 않을까?"Swing으로 GUI를 만들면서 FlatLaf, SwingWorker, JEditorPane을 처음 써봤다. 그 과정에서 배운 것들.3줄 요약FlatLaf 한 줄로 다크 테마: FlatDarculaLaf.setup() 한 줄로 IntelliJ 스타일 모던 UISwingWorker로 UI 블로킹 방지: 분석 작업을 백그라운드에서 실행하여 반응성 유지JEditorPane + HTML로 유연한 표현: 색상, 텍스트 선택, 복사 기능을 동시에 지원들어가며이전 글에서 분석 결과를 Excel로 정리하는 방법을 다뤘다.CLI와 Excel, 두 가지 출력 방식이 완성됐는데... 한 가지 고민이 생겼다. "명령어로 해야하는건 접근성이..
분석 결과를 Excel로 정리하기 - Apache POI 활용기
·
토스 러너스하이 2기/기술
분석은 됐는데, 산출물은 어떻게 만들지?산출물 작성할 때 참고할 수 있는 레퍼런스가 필요했다. Apache POI로 Excel을 생성하면서 배운 것들.3줄 요약Excel 출력은 "산출물 작성 시 복사/붙여넣기, 필터링으로 참고할 레퍼런스"다계층 구조(트리)는 Excel 필터링에 불편하다 → 평면 테이블로 변환파라미터는 Controller + SQL 합집합으로 표시하는 게 실용적이다1. 들어가며이전 글에서 CLI 출력을 구현했다. 터미널에서 분석 결과를 바로 확인할 수 있게 됐다.CLI만으로는 부족하다[GET] /api/user/list├── [Controller] UserController.getList()│ └── [Service] UserService.findAll()│ └── [DAO..
분석 결과를 어떻게 보여줄까? - CLI 출력 구현기
·
토스 러너스하이 2기/기술
분석은 됐는데, 결과를 어떻게 보여주지?GUI보다 CLI를 먼저 만든 이유, 그리고 박스 문자, ANSI 색상, Windows 인코딩과의 전쟁을 정리한다.3줄 요약콘솔 출력은 "터미널용 신택스 하이라이팅"이다. 트리 문자로 구조를, ANSI 색상으로 레이어를 구분한다Picocli로 CLI 옵션을 어노테이션 하나로 처리할 수 있다Windows 콘솔 인코딩 문제는 UTF-8 PrintStream + 배치 래퍼로 해결했다1. 들어가며이전 글에서 정적 분석의 한계를 다뤘다. 분석은 완성됐는데, 결과를 어떻게 보여줄까?분석은 됐는데, 결과를 어떻게 보여주지?지금까지 만든 것:JavaParser로 Java 코드 파싱재귀 탐색으로 호출 흐름 추적iBatis/MyBatis XML에서 SQL 추출분석 로직은 완성됐다. ..
정적 분석의 한계 - 해결할 수 없는 것들
·
토스 러너스하이 2기/기술
레거시 코드 분석 도구를 만들면서 마주친 정적 분석의 본질적 한계, 그리고 그 한계를 어떻게 다뤘는지 정리한다. 3줄 요약정적 분석은 런타임 정보를 알 수 없다는 본질적 한계가 있다다중 구현체 문제는 해결 대신 경고하는 것이 더 나은 선택이었다순환참조 오탐은 "전체 방문 기록"에서 "호출 스택"으로 개념을 바꿔 해결했다1. 들어가며: 분석이 잘 되는데... 뭐가 문제야?이전 글에서 호출 흐름 분석 도구를 완성했다.UserController.selectUser()└── UserServiceImpl.selectUser() └── UserDAO.selectUser() └── SQL: SELECT * FROM TB_USERController부터 SQL까지 잘 추적한다. 잘 동작한다.그런데 어느..
DAO에서 SQL까지 - XML 파싱으로 연결하기
·
토스 러너스하이 2기/기술
XML은 Java가 아니다. 어떻게 파싱하지?3줄 요약Java 코드에서 SQL을 찾으려면 XML 파일을 파싱해야 한다 (iBatis/MyBatis)XML 파싱에는 JDOM2 라이브러리를 사용했다 (DOM보다 직관적)폐쇄망 환경에서는 DTD 검증을 비활성화해야 한다 (외부 네트워크 차단)1. 들어가며: Java가 아닌 걸 어떻게 분석하지?이전 글에서 재귀와 백트래킹으로 호출 흐름을 추적했다.UserController.selectUser()└── UserServiceImpl.selectUser() └── UserDAO.selectUser() └── ??? ← 이제 SQL을 연결해야 한다DAO까지 추적하는 건 됐다. 이제 SQL을 연결해야 한다.전자정부프레임워크에서 SQL은 Java 코드에 ..
호출 흐름을 어떻게 따라가나? - 재귀와 백트래킹
·
토스 러너스하이 2기/기술
처음 배운 사람의 정리3줄 요약호출 흐름을 저장하려면 트리 구조가 필요하다트리를 만들 때는 재귀 함수가 자연스럽다순환 참조 방지의 핵심: add()만 하면 버그, remove()도 해야 정상1. 들어가며: 레거시 코드 분석, 이런 경험 있지 않나요?"이 API가 어떤 Service를 호출하고, 그 Service가 어떤 DAO를 호출하는지..."IDE에서 Ctrl+클릭으로 하나씩 따라가다 보면 어느새 10개 파일을 열어놓고 있다.신규 프로젝트 투입 첫날, 선임이 "이 API 분석해봐"라고 하면 시작되는 노가다.파일 하나 열고, 호출되는 메서드 찾고, 또 그 파일 열고...이걸 자동화하고 싶었다.이전 글에서 JavaParser로 메서드 호출을 찾는 방법을 정리했다.// JavaParser로 찾은 메서드 호출..