java class 파일들 한번에 디컴파일(Decompile) with jd-cli

Posted on 2025. 10. 29. 10:04
Filed Under Programming/Java

레거시 소스를 class 파일들로 받았다.

로직을 그대로 옮겨야한단다.

해서, 디컴파일이 필요한데 jd-gui는 파일별로 실행해야해서 피곤하니 jd-cli를 사용해서 하위 디렉토리 포함하여 모든 class파일을 한번에 디컴파일한 방법을 기술한다.

 

 

1. JDK 8이상 설치 필요

2. JD-CLI 다운로드 (https://github.com/kwart/jd-cli/releases)

유의사항은 Release 중에 소스만 있는 경우도 있고 jd-cli.jar가 포함된 경우도 있으므로 jar 포함된 버전으로 다운로드할 것!

3. 명령어  실행

# src_classes: 소스 위치 / src_decompiled: 디컴파일한 파일 저장할 위치
java -jar jd-cli.jar -ods src_decompiled src_classes

■ 명령어/옵션,역할 (개발자를 위한 쉬운 설명)
-ods src_decompiled: .java 파일들을 저장할 새 폴더를 지정합니다. 이 옵션(–outputDirStructured)은 원본 소스 코드의 패키지 구조(com/example/Class.java 등)를 그대로 유지하며 저장합니다.
src_classes: 변환할 대상 폴더 (.class 파일들이 들어있는 폴더)를 지정합니다. $\text{jd-cli}$가 이 폴더 안의 모든 .class 파일을 자동으로 찾아 변환합니다.

※ class파일 외의 모든 디렉토리/파일 구조가 그대로 복사됨.

 

 

반응형

[Sequelize] associations(관계) 정의

Posted on 2025. 3. 26. 14:23
Filed Under DB

1-1, 1-N, N-M 등 모델 간에 관계를 정의해 둬야 JOIN(include)를 알아서 처리한다.
DBMS에 있는 관계정의와 상관없이 sequelize 모델에 정의되어 있어야 함.

A belongsTo B (One-To-One or One-To-Many): A가 B에 속한다.
City.belongsTo(Coutry) -> city.getContry()

A hasMany B (One-to-Many): A는 많은 B를 가진다.
country.hasMany(City) -> country.getCities()

A belongsToMany B through C (Many-to-Many): A는 C매핑테이블을 통해서 B에 속한다.
User.belongsToMany(Project, { through: ProjectUser });
Project.belongsToMany(User, { through: ProjectUser });

반응형

각종 민원/기관 링크 모음 (continue..)

Posted on 2023. 8. 8. 08:47
Filed Under 일상

lastUpdated: 2023.08.08

 

▼건강보험/국민연금 : 자동이체 신청하기 (updated: 2023.08.08)

https://www.nhis.or.kr/nhis/index.do

 

국민건강보험

이벤트 1 / 8

www.nhis.or.kr

  • 메뉴: 개인민원 > 보험료납부 > 자동이체신청
  • 자동이체 서비스 제공시간: 09:00 ~ 22:00입니다.(토,일요일 및 공휴일 제외)

▼큐넷 : 국가자격증 응시

https://www.q-net.or.kr

 

Q-Net 자격의 모든 것

 

www.q-net.or.kr

 

 

 

반응형

[postgresql] 메타데이터 & 자주쓰는 쿼리(정리중..)

Posted on 2023. 7. 18. 09:34
Filed Under DB

lastUpdated: 2023.12.08

 

▼DB 용어

#DDL(Data Definition Language): CREATE/DROP, ALTER(스키마/도메인/테이블/뷰/인덱스를 정의/변경/제거 등)

#DML(Data Manipulation Language): INSERT/UPDATE/DELETE(데이터 관리)

#DCL(Data Control Language): COMMIT/ROLLBACK, GRANT/REVOKE (보안/무결성/회복/병행 제어 등을 정의)

 

▼SELECT

-- 변수 정의대신 CTE활용
WITH KEYS(ORD_ID, PAY_REQ_ID) --주문번호, 요청번호
  AS ( VALUES(
	  NULL --'20230905050132740'
    , NULL --'f0e3091d-8cd9-4186-b1c4-58859db39d7a'
    ) )
SELECT *
  FROM TBL1 T
 WHERE T.ORD_ID = (SELECT COALESCE(ORD_ID, T.ORD_ID) FROM KEYS) --◀
-- OR
WITH CTE AS (
  SELECT 'SYS-LOCAL' AS sys_id 
        ,'http://localhost:8081' AS sys_domn
)
SELECT sys_id, sys_domn
 FROM CTE;

 

▼메타데이터

-- 현재 database의 모든 테이블 목록 조회
select * from information_schema.tables where table_name;

-- 모든 database하의 모든 테이블 목록 조회
select * from pg_catalog.pg_tables 
 where tablename  like 'tbl_%' 
order by schemaname, tablename;

-- 테이블/컬럼 목록
   SELECT ps.schemaname, ps.relname as table_nm, obj_description(ps.relid)  as table_comment
		 ,pa.attname as column_nm, pd.description as column_comment
	 FROM pg_stat_all_tables ps
	 	  LEFT OUTER JOIN pg_description pd on ps.relid=pd.objoid
	 	  INNER JOIN pg_attribute pa on pd.objoid=pa.attrelid and pd.objsubid=pa.attnum
	WHERE 1=1
  	  AND pd.objsubid<>0
	  AND ps.schemaname='admdbt'
    --AND ps.relname='테이블'
 ORDER BY ps.relname, pd.objsubid;

▼DBMS 관련

-- DB서버 설정 리스트 조회
SHOW ALL;
SELECT * FROM pg_settings WHERE NAME LIKE '%port%';
SELECT * FROM pg_settings where name like '%version%'

-- 특정 설정값 조회
SELECT CURRENT_SETTING('TIMEZONE');
 │Asia/Seoul
SELECT CURRENT_SETTING('PORT')
 │5534
SHOW LC_COLLATE
 │en_US.UTF-8

▼테이블 관리(DML)

-- 컬럼 타입 변경
ALTER TABLE 테이블 ALTER COLUMN 컬럼 TYPE 타입;

-- FK로서 사용중인 컬럼을 포함한 PK 수정하기
ALTER TABLE 테이블 
  DROP CONSTRAINT PK제약ID CASCADE,
  ADD PRIMARY KEY (PK컬럼1, PK컬럼2, ..);

 

▼유틸성

-- Oracle의 NVL과 동일(컬럼값이 NULL이면 값 대체)
SELECT SUM(COALESCE(VAL1, 0)) AS TOT_SUM FROM table;

▼날짜시간 다루기

-- DB에는 UTC시각으로 저장됨. 조회시 표시는 설정된 timezone 기준으로 표시
SELECT NOW() AT TIME ZONE 'UTC' AS UTC기준시
	 , NOW() AT TIME ZONE 'CEST' AS CEST기준시각
	 , CURRENT_SETTING('TIMEZONE') AS TIMEZONE
	 , DATE_PART('hour', NOW() - NOW() AT TIME ZONE 'UTC') AS utc_offset
 │utc기준시	cest기준시각	timezone	utc_offset
 │2023-09-06 08:15:23.126	2023-09-06 10:15:23.126	Asia/Seoul	9
 
-- Timezone 정보 리스트
SELECT * FROM pg_timezone_names WHERE abbrev IN ('KST','CET','CEST','UTC') ORDER BY abbrev;
 │name			abbrev	utc_offset	is_dst
 │Asia/Seoul	KST		09:00:00	false
 │Europe/Berlin	CEST	02:00:00	true
 ...
 

▼트랜잭션 (출처: https://miniweb4u.tistory.com/188)

-- 실행중인 쿼리 목록 조회(for PID)
SELECT * FROM pg_stat_activity 
WHERE datname = 'db_name'
  AND state LIKE '%idle%'
  AND query LIKE '%alter%'

-- 실행중인 쿼리 취소
SELECT pg_cancel_backend(pid int);

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
반응형

[mysql/mariadb] 자주 사용 쿼리 & 메타데이터 (continue)

Posted on 2022. 10. 12. 10:03
Filed Under DB

 

-- DBMS Version 확인
select @@version; --또는 select version();

-- 모든 시스템 변수 리스트
SHOW GLOBAL VARIABLES;
-- SHOW GLOBAL VARIABLES LIKE 'char%';
-- SHOW GLOBAL VARIABLES LIKE 'collation%';

-- database(=schema) 목록
SELECT DISTINCT table_schema FROM INFORMATION_SCHEMA.TABLES;

-- 현재 DB스미마
SET @current_db = DATABASE();
SELECT @current_db;
 
-- 사용자 정보
SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILIEGES;
-- 실행중인 커맨드
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;

-- 테이블 구조/설명 조회
DESC INFORMATION_SCHEMA.TABLES;

-- 테이블/컬럼 구조
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'XXX'
SELECT * FROM INFORMATION_SCHEMA.COLUMNS;

-- 간단히 변수 선언해서 사용하기
SET @PARAM1 = 1; -- 변수명 앞에 @골뱅이 필수!!
SELECT @PARAM1;

-- 날짜 다루기
SELECT CAST(NOW()) as DATE);
SELECT STR_TO_DATE('20230111', '%Y%m%d');
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); // MINUTE, MONTH, YEAR
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY); // 또는 DATE_ADD의 INTERVAL 값을 음수로 넣으면 같은 결과
SELECT DATE_FORMAT(CURRENT_TIMESTAMP(), '%Y%m%d%H%i%s');

-- 유효체크
SELECT CASE WHEN STR_TO_DATE('2023XXXX') IS NOT NULL THEN '정상' ELSE '비정상' END; // 날짜문자열인지 체크
SELECT CASE WHEN '99' REGEXP '^[0-9]+$ = 1 THEN '숫자' ELSE '숫자아닌문자열포함' END;

MariaDB 레퍼런스: https://mariadb.com/kb/en/ (MariaDB Server > Tutorials)

 

-- 현재 설정 확인
SHOW VARIABLES LIKE 'max_connections'; -- Too many connection 확인.
-- 임시 증가 (재시작시 초기화됨)
-- SET GLOBAL max_connections = 200;

SHOW PROCESSLIST;

SHOW FULL PROCESSLIST;

-- 오래된 연결만 확인
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST 
-- WHERE TIME > 3600 -- 1시간
ORDER BY TIME DESC;

SELECT ID, USER, HOST, STATE, TIME 
	,CONCAT(
        IF(TIME >= 3600, CONCAT(FLOOR(TIME/3600), 'h '), ''),
        IF(TIME >= 60, CONCAT(FLOOR((TIME % 3600)/60), 'm '), ''),
        (TIME % 60), 's'
    ) AS time_formatted
FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE 1=1
  and COMMAND = 'Sleep' -- 1. Sleep: 유휴 상태/2. Query: 쿼리 실행 중/3. Connect: 연결 중/4. Binlog Dump: 복제 중/5. Killed: 종료 중
  and user = 'she_admin'
--   AND TIME > 1800 -- 30분 이상
  and HOST like '%10.10.10.10%'
ORDER by TIME DESC;

kill 8197;

 

▼ DB테이블 상세설계 조회

-- 테이블 목록
SELECT TABLE_NAME AS 테이블ID, TABLE_COMMENT AS 테이블명
	   ,DATE_FORMAT(CREATE_TIME, '%Y-%m-%d') AS 생성일
FROM information_schema.TABLES
WHERE 1=1
   AND TABLE_TYPE = 'BASE TABLE' -- SYSTEM VIEW, BASE TABLE, VIEW, SEQUENCE
   AND TABLE_SCHEMA in ('XXX','YYY')
   AND TABLE_NAME NOT LIKE '!_%' ESCAPE '!' /*미사용(prefix: _) 테이블 제거*/
ORDER BY TABLE_SCHEMA, TABLE_NAME;

-- 컬럼 목록 추출 
SELECT
    t.TABLE_SCHEMA,
    t.TABLE_NAME AS 테이블ID, t.TABLE_COMMENT AS 테이블명,
    c.ORDINAL_POSITION as COL_ORD, c.COLUMN_NAME AS 컬럼ID, c.COLUMN_COMMENT AS 컬럼명,
    CONCAT(c.COLUMN_TYPE) AS 데이터타입,
    CASE WHEN c.IS_NULLABLE = 'NO' THEN 'Y' ELSE '' END AS NOT_NULL,
    COALESCE(c.COLUMN_DEFAULT, '') AS 디폴트값,
    -- LEFT JOIN으로 외래 키 정보를 가져와서, k.REFERENCED_TABLE_NAME이 NULL이 아니면 'Y'
    CASE WHEN k.REFERENCED_TABLE_NAME IS NOT NULL THEN 'Y' ELSE '' END AS FK
FROM
    information_schema.COLUMNS c
    INNER JOIN
        information_schema.TABLES t ON c.TABLE_NAME = t.TABLE_NAME AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
    LEFT JOIN
        information_schema.KEY_COLUMN_USAGE k
        ON k.TABLE_SCHEMA = c.TABLE_SCHEMA
        AND k.TABLE_NAME = c.TABLE_NAME
        AND k.COLUMN_NAME = c.COLUMN_NAME
        AND k.REFERENCED_TABLE_NAME IS NOT NULL -- 외래 키 조건
WHERE 1=1
  AND t.TABLE_TYPE = 'BASE TABLE' -- SYSTEM VIEW, BASE TABLE, VIEW, SEQUENCE
  AND t.TABLE_SCHEMA in ('xxx','ttt')
GROUP BY t.TABLE_SCHEMA, t.TABLE_NAME, c.COLUMN_NAME -- 중복 제거 (FK 정보가 여러 번 잡힐 수 있으므로)
ORDER BY c.TABLE_SCHEMA, t.TABLE_NAME, c.COLUMN_NAME;

 

▼ DB프로시저,함수 조회

-- DB프로시저/함수 목록 조회(본문 스크립트 포함)
SELECT 
     routine_schema AS '데이터베이스명'
    ,routine_name AS '루틴명'
    ,routine_type AS '타입'
    ,data_type AS '반환_데이터타입'
    ,routine_definition AS 'DDL스크립트'
    ,created AS '생성일시',last_altered AS '최종수정일시'
FROM 
    information_schema.ROUTINES
WHERE 1=1
  AND routine_schema IN ('스키마1', '스키마2')
ORDER BY 
    routine_type, routine_name;
    
-- DB프로시저/함수 전문(선언문+본문) 스크립트 조회
SHOW CREATE FUNCTION db_schema.함수이름;
SHOW CREATE PROCEDURE db_schema.프로시저이름;

 

백업테이블 생성

-- CREATE TABLE
CREATE TABLE 생성할_테이블명 
AS 
SELECT * FROM 원본_테이블명
WHERE 복사할_데이터_조건;

 

▼ 쉼표(,)로 연결된 값 목록 뽑기

-- 코드명(값), ... 
SELECT  GROUP_CONCAT(
        CONCAT(TRIM(cl_nm), '(', cl_cd, ')')
        SEPARATOR ', '
    ) AS combined_text
FROM comn_code where grp_cd = '공통코드그룹ID'

 

 

-- [MIG] AS-IS vs TO-BE 컬럼 목록
-- (필수조건: AS-IS/TO-BE 컬럼 순서를 동일하게 만들었을때)
SELECT
    COALESCE(T1.ORDINAL_POSITION, T2.ORDINAL_POSITION) AS ORD,
    T1.COLUMN_NAME AS COL_2,
    T1.COLUMN_COMMENT AS COMMT_2,
    T2.COLUMN_NAME AS COL_1,
    T2.COLUMN_COMMENT AS COMMT_1
FROM (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = 'TOBE테이블' AND TABLE_SCHEMA = 'db스키마'
      ) T1
LEFT JOIN
    (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'ASIS테이블' AND TABLE_SCHEMA = 'db스키마'
    ) T2
    ON T1.ORDINAL_POSITION = T2.ORDINAL_POSITION
WHERE 1=1
  UNION 
SELECT
    COALESCE(T1.ORDINAL_POSITION, T2.ORDINAL_POSITION) AS ORD,
    T1.COLUMN_NAME AS COL_2,
    T1.COLUMN_COMMENT AS COMMT_2,
    T2.COLUMN_NAME AS COL_1,
    T2.COLUMN_COMMENT AS COMMT_1
FROM (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = 'TOBE테이블' AND TABLE_SCHEMA = 'db스키마'
      ) T1
RIGHT JOIN
    (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'ASIS테이블' AND TABLE_SCHEMA = 'db스키마'
    ) T2
    ON T1.ORDINAL_POSITION = T2.ORDINAL_POSITION
WHERE 1=1

 

반응형

About

by 쑤기c

반응형