hj_kim97의 등록된 링크

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

Naver Blog

[Spring]스프링 AOP

스프링 AOP - @Aspect AOP - 스프링 AOP 개념 - 스프링 AOP 구현 - 스프링 AOP 포인트컷 선행해야 할 내용 - 스프링 빈 후처리기: https://blog.naver.com/hj_kim97/223168959350 - 스프링이 지원하는 프록시: https://blog.naver.com/hj_kim97/223119578660 참고하면 좋은 글 - 스프링 관점 지향 프로그래밍(AOP): https://blog.naver.com/hj_kim97/222629504843 @Aspect AOP 스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저(Advisor)를 만들어서 스프링 빈으로 등록하면 된다. 그러면, 자동 프록시 생성기(Auto Proxy Creator)가 스프링 빈으로 등록된 어드바이저들을 찾고, 스프링 빈들에 자동으로 프록시를 적용해준다. @Aspect는 스프링 프레임워크에서 AOP를 구현하기 위한 어노테이션입니다. 클래스

Naver Blog

[MySQL/MariaDB]날짜 테이블 만들기 (임시 테이블, WITH, WITH RECURSIVE)

MySQL 날짜 테이블 만들기 - 개요 - WITH, WITH RECURSIVE 문법 - 날짜 테이블 만들기 개요 가끔 통계 쿼리를 짤 때 날짜별 목록이나 시간 목록이 필요한 경우가 있다. 서로 다른 테이블에 대해서 날짜를 통한 연관 관계를 맺어서 데이터를 가져오는 경우나 차트를 그릴 때 값이 존재하지 않는 날짜도 차트에 출력하고 싶은 경우 등 날짜 테이블이 없는 경우 임시 테이블을 만들어 날짜 리스트를 뽑아낼 수 있다. 날짜 테이블을 만들기 위해서 SQL 문법의 임시 변수를 사용하거나, WITH 구문을 이용할 수 있다. 그 외에도 WITH 구문을 이용해 많은 부분 용이하게 사용할 수 있다. WITH, WITH RECURSIVE 문법 WITH 구문은 메모리 상에 가상의 테이블을 저장할 때 사용된다. RECURSIVE의 여부에 따라 재귀, 비재귀 두 가지 방법으로 사용 가능하다. ※ 주의: MySQL 8.0 버전 이하에서는 WITH 구문을 사용할 수 없다. WITH 구문 WITH [R

Naver Blog

[MyBatis]MyBatis Java API 및 SQL Builder 사용법

MyBatis Java API 및 SQL Builder 사용법 - 개요 - MyBatis 3.0 - MyBatis-Spring 모듈 - Spring Boot MyBatis 연동하기 - MyBatis Java API - MyBatis SQL Builder 선행해야 할 내용 - MyBatis 연동하기: https://blog.naver.com/hj_kim97/222617895949 - MyBatis 동적 쿼리 문법: https://blog.naver.com/hj_kim97/222651531009 - MyBatis 기본 사용법: https://blog.naver.com/hj_kim97/223080765467 개요 MyBatis3.0+ 에서 제공하는 Java API와 SQL Builder를 이용하여 XML을 이용하지 않고 SQL Mapper를 이용하는 방법을 정리한다. MyBatis 3.0에 대해서 간략히 설명하고, 프로젝트에 쉽게 연동하기 위한 MyBatis-Spring 모듈을 설명한다.

Naver Blog

[Java]ModelMapper 및 MapStruct 사용법(객체 매핑 라이브러리)

ModelMapper 및 MapStruct 사용법 - 개요 - 실습 환경 구축 - 객체 직접 매핑 - ModelMapper - MapStruct 개요 ModelMapper와 MapStruct는 Java에서 데이터 매핑 작업을 도와주는 라이브러리로 특정한 객체의 필드 값들을 자동으로 대상 객체에 매핑(Mapping) 시켜주는 라이브러리이다. 예를 들어, Spring 환경에서 Controller, Service, Repository에서 사용하는 스팩이 다르다. 이러한 경우 하나의 클래스로 모든 영역에서 사용할 수 있지만, 해당 영역에서 불필요한 필드가 존재하게 되고, 모든 영역에서 해당 클래스만을 의존하게 된다. 때문에, Controller로 넘어오는 파라미터를 Service 영역에 넘길 때는 Service 영역에서 사용하는 Dto로 변환하고, Service로 넘어오는 파라미터를 Repository 영역에 넘길 때는 Entity로 변환하는 등 작업이 필요하다. 객체를 다른 객체로 변환하

Naver Blog

2023년 회고 및 2024년 목표

2023년 회고 및 2024년 목표 - 2023년 기록 - 2024년 목표 - PS 2024년 1월에 작년 회고록을 적는 것을 다짐했지만, 미루는 습관으로 작성하지 못하였다. 4월이 된 지금 늦은 감이 있지만 작년에 대한 기록과 이번 연도에 목표를 정리하고 현재 생활을 점검해 보는 차원에서 작성해 보려고 한다. 2023년 기록 2023년의 학습과 자기개발 월 내용 1월 정은구님 Spring Boot JWT Tutorial 강의 김영한님 스프링 핵심 원리 - 기본편 강의 김영한님 모든 개발자를 위한 HTTP 웹 기본 지식 강의 2월 최주호님 스프링부트 시큐리티&JWT 강의 김영한님 스프링 MVC 1편 강의 푸(Foo)님 백엔드 시스템 실무 강의 3월 김영한님 스프링 MVC 2편 강의 4월 김영한님 스프링 DB 1편 강의 김영한님 스프링 DB 2편 강의 진유림님 만들면서 배우는 리액트 기초 강의 자바와 JUnit을 활용한 실용중의 단위 테스트 책 오늘, 또 일을 미루고 말았다 책(비개발

Naver Blog

[RabbitMQ]RabbitMQ 기초 개념 (AMQP, Exchange Type)

RabbitMQ 기초 개념 - RabbitMQ - RabbitMQ 도메인 지식(AMQP, Exchange Type) - RabbitMQ 특징 - Message Queue 사용 이유 RabbitMQ RabbitMQ는 메시지 시스템을 구성할 수 있는 AMQP 기반의 오픈소스 메시지 브로커로 메시지 큐들을 관리하며, 서로 다른 시스템 혹은 컴포넌트 간에 효율적으로 메시지를 교환할 수 있는 다양한 기능을 제공한다. 공식 사이트: https://www.rabbitmq.com/ 무료 및 오픈 소스 라이선스: Apache License 2.0과 Mozilla Public License 2 오픈 소스 메시지 브로커 소프트웨어로 AMQP를 구현 추가적으로 STOMP, MQTT 등 프로토콜 지원을 위해 플러그인 구조와 함께 확장 RabbitMQ 도메인 지식 RabbitMQ을 알기 위해서는 AMQP 프로토콜을 알아야 한다. 또한, AMQP 표준 프로토콜에서 제공하는 기본적인 구성 요소와 표준 Excha

Naver Blog

[RabbitMQ]RabbitMQ 설치 및 기초 사용법(CLI, GUI)

RabbitMQ 설치 및 기초 사용법 - 개요 - RabbitMQ 설치 - RabbitMQ CLI 사용법 - RabbitMQ CLI 사용 예시 - RabbitMQ GUI 사용법 - RabbitMQ GUI 사용 예시 선행해야 할 내용 RabbitMQ 기초 개념: https://blog.naver.com/hj_kim97/223415313413 Docker 개념 및 사용법: https://blog.naver.com/hj_kim97/222870522243 RabbitMQ 설치 RabbitMQ를 직접 설치하는 경우 RabbitMQ Server와 Erlang을 설치 및 환경 변수를 등록하고, RabbitMQ를 GUI로 관리하기 위한 플러그인을 직접 설치해야 한다. Earlnag 다운로드: https://www.erlang.org/downloads RabbitMQ 다운로드: https://www.rabbitmq.com/docs/download 1. RabbitMQ 다운로드 및 설치 2. Earl

Naver Blog

[RabbitMQ]Java RabbitMQ 연동 및 사용법

Java RabbitMQ 연동 및 사용법 - 개요 - 튜토리얼 1. Hello-World - 튜토리얼 2. Work Queues(작업 대기열) - 튜토리얼 3. Publish&Subscribe(게시/구독) - 튜토리얼 4. Routing(라우팅) - 튜토리얼 5. Topic(토픽) 선행해야 할 내용 RabbitMQ 설치 및 기초 사용법: https://blog.naver.com/hj_kim97/223422458502 개요 해당 내용은 RabbitMQ 공식 홈페이지와 깃허브에 설명된 내용을 참고로 작성하였다. 공식 깃허브 튜토리얼 코드는 하나의 폴더 안에 모든 Java 파일이 존재하여, 튜토리얼 별로 개별 폴더를 만들어 새롭게 작업하였다. 공식 홈페이지: https://www.rabbitmq.com/tutorials/tutorial-one-java 공식 깃허브: https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/java 폴더 구조 변

Naver Blog

[Spring]SpringBoot 3 Handlebars 연동하기(SpringBoot3 마이그레이션)

Spring Boot 3 Handlebars 연동하기 - 개요 - Handlebars 연동 - Handlebars 레이아웃 나누기(Partials) 개요 최근 회사에서 Spring Boot 2.x 버전에서 3.x로 마이그레이션을 진행하였다. Spring Boot 3 부터는 JDK 17 부터 지원이 되고, Spring Security는 Lamda DSL 방식으로 설정하는 SecurityFilterChain을 빈으로 등록하는 방식으로 변경되고, Oracle 과의 라이선스 문제로 인해 javax 패키지가 jakarta로 변경되었으며, 그 외에도 Spring Boot 2버전에서 3버전으로 바뀌면서 많은 부분이 변경되었다. JDK 8, 11 → JDK 17 WebSecurityConfigurerAdapter 구현 → SecurityFilterChain, WebSecurityCustomizer 빈 등록 https://spring.io/blog/2022/02/21/spring-security-w

Naver Blog

[RabbitMQ]Spring Boot RabbitMQ 연동 및 사용법(Spring AMQP)

Spring Boot RabbitMQ 연동 및 사용법 - 개요 - 프로젝트 생성 및 환경 설정 - 튜토리얼 1. Hello-World - 튜토리얼 2. Work Queues(작업 대기열) - 튜토리얼 3. Publish&Subscribe(게시/구독) - 튜토리얼 4. Routing(라우팅) - 튜토리얼 5. Topic(토픽) 선행해야 할 내용 - RabbitMQ 기초 개념: https://blog.naver.com/hj_kim97/223415313413 - RabbitMQ 설치 및 사용법: https://blog.naver.com/hj_kim97/223422458502 - Java RabbitMQ 연동 및 사용법: https://blog.naver.com/hj_kim97/223429991816 개요 해당 내용은 RabbitMQ Github Tutorial 코드를 참고하여 작성하였습니다. RabbitMQ 관련하여 기본적인 개념과 사용법에 대해서는 이전 포스팅을 보시길 권장합니다. Ra

Naver Blog

[Spring]스프링이 지원하는 프록시(프록시 팩토리, 포인트컷, 어드바이스, 어드바이저)

스프링이 지원하는 프록시 - 동적 프록시 기술 - 프록시 팩토리(Proxy Factory) - 포인트컷, 어드바이스, 어드바이저 선행해야 할 내용 Java 동적 프록시 기술: https://blog.naver.com/hj_kim97/223118965106 동적 프록시 기술 동적 프록시 기술은 이름 그대로 개발자가 직접 프록시 객체를 생성하지 않고, 프록시 객체를 동적으로 런타임에 만들어주는 기술이다. 주로 Java의 'java.lang.reflect.Proxy' 클래스를 사용하는 JDK 동적 프록시와 바이트코드 조작 라이브러리인 CGLIB를 사용한다. JDK 동적 프록시: 인터페이스를 기반으로 동적 프록시를 생성한다. CGLIB: 상속(클래스)을 기반으로 동적 프록시를 생성한다. 문제점 JDK 동적 프록시와 CGLIB에서 기반으로 하는 대상이 다르다. 때문에, 인터페이스가 있는 경우에는 JDK 동적 프록시를 적용하고, 그렇지 않은 경우에는 CGLIB를 적용해야 한다. 두 기술을 함께

Naver Blog

[JavaScript]비동기 처리(Promise, Async&Await, Fetch API) 사용법 정리

JavaScript 비동기 처리(Promise, Await&Async, Fetch API) 사용법 정리 - 동기와 비동기 - Promise - async & await - API 호출(Fetch API) 참고하면 좋은 글 AJAX, 동기, 비동기: https://blog.naver.com/hj_kim97/222881703185 Promise: https://blog.naver.com/hj_kim97/222587367534 동기와 비동기 동기(Synchronous) 자바스크립트에서 코드는 기본적으로 작성한 순서에 따라 위에서부터 아래로 순차적으로 실행합니다. 이처럼 순차적으로 코드를 실행하는 것을 동기(Sqynchronous)라고 합니다. 요청을 하면 결과가 주어질 때까지 다른 요청이 처리되지 않으며, 해당 요청 결과가 처리된 후 다음 순서에 맞춰 진행됩니다. 계좌이체 같은 작업은 동기 방식으로 처리 되어야 합니다. 블로킹 방식 // A -> B -> C console.log("A")

Naver Blog

[Java]JMH(Java Microbenchmark Harness) 사용법

JMH(Java Microbenchmark Harness) 사용법 - JMH - JMH 어노테이션 - JMH 사용하기 JMH JMH는 Java Microbenchmark Harness의 약자로, 자바 마이크로벤치마크를 작성하고 실행하기 위한 도구입니다. JMH는 OpenJDK 프로젝트의 일부로 개발되었으며, 자바 가상 머신(Java Virtual Machine, JVM) 상에서의 성능 측정과 비교를 용이하게 해줍니다. JMH는 다양한 유형의 벤치마크를 작성할 수 있는 다양한 어노테이션과 API를 제공합니다. 이를 통해 개발자는 자신의 코드 조각에 대한 성능 테스트를 작성하고, 다른 구현과 비교하여 성능을 평가할 수 있습니다. 즉, JMH는 Micro Benchmark Framework로 JDK를 오픈 소스로 제공하는 OpenJDK에서 만든 성능 측적용 라이브러리입니다. JMH 공식 Github: https://github.com/openjdk/jmh 안정성: JMH는 신뢰할 수 있는

Naver Blog

[도서 리뷰]쉽게 시작하는 타입스크립트

쉽게 시작하는 타입스크립트 저자: 장기효 출판: 길벗 발매: 2023/06/16 책의 내용 해당 책은 자바스크립트에 타입은 부여한 타입스크립트 언어를 공부할 수 있는 책이다. 타입스크립트가 등장하게 된 배경부터 타입스크립트를 왜 배워야 하는지에 대한 설명으로 시작하고, 개발 환경 구성 및 기초 문법을 알려주고 중간마다 배운 내용을 정리할 수 있도록 예제 프로젝트가 제공된다. 타입스크립트가 자바스크립트에 타입이 부여된 만큼 해당 책을 읽는 독자는 자바스크립트에 대해서 이미 알고 있는 상태여야 한다. 하지만, 책에서는 자바스크립트에 깊이 있게 알지 못한 초심자도 타입스크립트를 배울 수 있도록 자바스크립트 클래스나 프로미스, 모듈 시스템, map 함수 등 자바스크립트 최신 문법이 필요한 부분이 나오면 이해를 돕기 위한 자바스크립트 ES6 문법을 먼저 알려주고 타입을 적용하는 방법을 알려준다. ES6 문법 좋았던 점 1. 많은 이미지 활용 책을 읽으면서 좋았던 점은 이미지 캡처가 많다는 점

Naver Blog

[JavaScript]동적 스크립트 로드(js 파일에서 js 파일 불러오기)

JavaScript 동적 스크립트 로드 - 개요 - 동적 스크립트 로드 - 동적 스타일시트 로드 - 동적 스크립트 로드 순서 보장하기 개요 JavaScript 특정 기능을 제공하는 플러그인이나 라이브러리를 사용할 때 여러 개의 JS 파일을 받아야하는 경우가 있다. Node.js에서는 모듈 시스템과 NPM을 통한 라이브러리 관리로 해당 내용과 관련이 없다. 또한, 최근 브라우저에서도 ECMAScript 모듈을 직접 로드할 수 있도록 <Script /> 태그에 type="module" 옵션이 제공된다. 다만, 이러한 방식은 모든 브라우저에서 동작하기 위해서 Babel과 같은 도구로 예전 브라우저도 호환이 가능하도록 변환해주어야 한다. 때문에, 최신 개발 환경이 아닌 레거시한 환경(Babel 등을 이용하지 않는)에서는 이러한 JS 파일을 동적으로 로드하는 방법을 정리한다. HTML 파일 내에서 모든 브라우저가 호환 가능한 JS 파일을 로드하는 방법을 정리한다. 동적 스크립트 로드 자바스크

Naver Blog

[JPA]JPQL 사용법 및 문법 정리

JPQL 사용법 및 문법 정리 - JPQL - JPQL 문법 · 서브 쿼리와 서브 쿼리 함수 · 집합과 정렬 · 기본 연산자 · 컬렉션 식 · 스칼라 식 - 조인 · 컬렉션 조인 · 세타 조인 · 조인 ON 절 · 패치 조인 · 패치 조인과 일반 조인의 차이 · 패치 조인의 특징과 주의점 - 프로젝션 · 엔티티 프로젝션 · 임베디드 타입 프로젝션 · 스칼라 타입 프로젝션 · 스칼라 타입 프로젝션 결과 조회 방법 - 쿼리 객체 (Query, TypedQuery) · 결과 조회 · 파라미터 바인딩 · 페이징 API · 벌크 연산 · 벌크 연산 주의점 - JPQL의 쿼리를 실행하는 방법 · 동적 쿼리(createQuery) · 정적 쿼리(createNamedQuery) · 스프링 Data JPA 사용시 JPQL JPQL은 "Java Persistence Query Language"의 약자로, 자바 기반의 영속성(Persistence) 프레임워크인 JPA(Java Persistence AP

Naver Blog

[도서 리뷰]현장에서 바로 써먹는 리액트 with 타입스크립트

현장에서 바로 써먹는 리액트 with 타입스크립트 저자: 김정헌 출판: 심통 발매: 2023/06/27 책의 내용 해당 책은 리액트 프로젝트를 타입스크립트 환경에서 개발하는 방법을 소개하는 책이다. 처음으로 웹의 역사에 대한 설명으로 시작하여, 리액트가 어떻게 탄생하게 되었는지에 대한 배경을 자세히 설명한다. 이 책은 2장부터 12장까지 리액트 프로젝트를 구성하는 방법을 다룬다. 2장부터 12장까지 총 11개의 장에서 다양한 주제와 프로젝트를 다루면서, 타입스크립트 환경에서의 리액트 개발을 단계적으로 익힐 수 있도록 구성되어 있다. 리액트를 타입스크립트 환경에서 개발하는 것은 최신 웹 개발에서 중요한 부분이며, 이 책은 타입스크립트를 활용한 프로젝트 구성에 초점을 맞추고 있어서 실무에서 바로 활용할 수 있는 유용한 지식을 제공합니다. 책의 구성과 다양한 프로젝트 예제들을 통해 타입스크립트 환경에서의 리액트 개발을 자연스럽게 익힐 수 있도록 도움을 준다. 사전 지식으로 HTML, CS

Naver Blog

[Spring]스프링 빈 후처리기(BeanPostProcessor, AutoProxyCreator)

스프링 빈 후처리기 - 빈 후처리기 (BeanPostProcessor) - 스프링이 제공하는 빈 후처리기 (AutoProxyCreator) 빈 후처리기 스프링에서 빈은 스프링 컨테이너가 생성하고 관리하는 객체를 말한다. 컨테이너는 빈의 생명 주기를 관리하며, 필요한 시점에 빈을 생성하고 의존성을 주입해준다. 기본적으로 빈은 XML 기반의 설정 파일, Java 어노테이션 등을 통해 스프링 컨테이너에게 제공된다. 쉽게, @Bean이나 컴포넌트 스캔으로 스프링 빈을 등록하면, 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부의 빈 저장소에 등록한다. 빈 후처리기는 빈 저장소에 관리되는 객체가 등록되기 직전에 조작하고 싶을 때 사용할 수 있다. 즉, @Bean 어노테이션이 정의된 객체가 빈 저장소에 등록되기 전에 다른 객체로 바꿔 저장하거나, 프록시로 교체하는 것이 가능하다. 생성: 스프링 빈 대상이 되는 객체를 생성한다. 전달: 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에

Naver Blog

[Java]어노테이션(Annotation) 개념 및 사용법

자바 어노테이션(Annotation) 개념 및 사용법 - 어노테이션(Annotation) - 어노테이션 종류 - 어노테이션 실무 활용 어노테이션(Annotation) 어노테이션(Annotation)은 소스 코드에 메타데이터(metadata)를 추가하기 위한 방법으로, 클래스, 메서드, 필드 등의 코드 요소에 정보를 부여하는 특별한 형식의 마커(marker)나 태그(tag)입니다. 어노테이션은 주석(comment)처럼 코드의 설명을 추가하는 용도로도 사용할 수 있지만, 주로 런타임 동작이나 컴파일 시의 특별한 처리를 위해 사용됩니다. 프로그램 코드에 메타데이터를 추가하는 기능으로 컴파일러나 런타임 시점에 코드를 처리하는 도구들에게 추가적인 정보를 제공한다. 주로 클래스, 메서드, 변수, 매개변수위에 정의하여 사용되고, 코드 가독성 향상과 자동화된 코드 생성, 테스트, 디버깅 등에 활용할 수 있습니다. 어노테이션 용도 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공 소프트웨어

Naver Blog

[Maven]메이븐 기본 사용법 및 POM 구조의 이해

메이븐(Maven) 기본 사용법 및 POM 구조의 이해 - 메이븐(Maven) - pom.xml - 플러그인과 Goal 설명 메이븐(Maven) 메이븐(Maven)은 소프트웨어 프로젝트의 빌드, 배포, 문서화 등을 관리하기 위한 도구입니다. 주로 Java 기반 프로젝트에서 사용되며, 프로젝트의 라이프사이클 관리와 종속성 관리를 지원하여 개발자가 효율적으로 프로젝트를 관리할 수 있도록 도와줍니다. 메이븐은 XML 기반의 프로젝트 설정 파일인 "pom.xml"을 사용하여 프로젝트의 빌드 및 설정 정보를 관리합니다. 이 설정 파일에는 프로젝트의 의존성, 빌드 단계, 플러그인 설정, 리소스 디렉토리 등에 대한 정보가 포함됩니다. 라이프사이클(Lifecycle): 메이븐은 빌드 단계를 미리 정의된 라이프사이클로 구성합니다. 예를 들어, "clean", "compile", "test", "package", "install", "deploy" 등의 단계가 있습니다. 각 단계는 특정 작업들을 수행

Naver Blog

[TypeScript]타입스크립트 인터페이스(확장, 선언 합침)

타입스크립트 인터페이스 - 인터페이스 - 인터페이스 확장하기 - 인터페이스 선언 합치기 인터페이스 타입스크립트에서 인터페이스(Interface)는 객체의 구조를 정의하는 역할을 합니다. 인터페이스는 객체의 속성과 메서드를 설명하고, 해당 객체가 가져야 하는 타입을 명시합니다. 인터페이스는 객체 간의 계약(Contract)으로 볼 수 있으며, 이를 통해 코드의 일관성과 재사용성을 높일 수 있습니다. 인터페이스란 타입 별칭과 동일하게 타입에 이름을 지어주는 또 다른 문법입니다. 또한 인터페이스는 객체의 구조를 정의하는데 특화된 문법으로 상속, 합침 등의 특수한 기능을 제공합니다. interface Person { name: string; age: number; } const person: Person = { name: "로그", age : 27 }; 선택적 프로퍼티 인터페이스를 설계할 때 어떤 속성은 반드시 있어야 하지만, 어떤 속성은 있어도 되고 없어도 되는 형태로 만들고 싶을 때가

Naver Blog

[JavaScript]자바스크립트 클래스(Class)

자바스크립트 클래스(Class) - JavaScript 클래스 - 필드 선언하기 - 필드 접근제어자 - 생성자 선언하기 - 메소드 정의하기 - extends를 통한 클래스 상속 - 클래스 기반으로 객체 생성하기 - 클래스 예제 코드 JavaScript 클래스 JavaScript에서 클래스(Class)는 객체 지향 프로그래밍(OOP)을 구현하기 위한 구조입니다. 클래스는 객체의 속성(상태)과 동작(메서드)을 정의하며, 이를 바탕으로 실제 객체(인스턴스)를 생성할 수 있습니다. JavaScript의 클래스는 ECMAScript 2015(ES6)에서 도입되었으며, 이전에는 프로토타입 기반 상속을 사용하여 OOP를 구현했습니다. 클래스를 사용하면 객체 생성 및 상속 등의 OOP 개념을 보다 명확하고 간결하게 표현할 수 있습니다. 공식 문서: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes 클래스 선언하기 Clas

Naver Blog

[TypeScript]타입스크립트 클래스(상속, 접근제어자, 필드생략, 인터페이스)

타입스크립트 클래스 - TypeScript 클래스 - 상속 - 접근 제어자 - 필드 생략하기 - 인터페이스와 클래스 선행해야 할 내용 - 자바스크립트 클래스: https://blog.naver.com/hj_kim97/223115262174 TypeScript 클래스 타입스크립트에서는 클래스의 필드를 선언할 때 타입 주석으로 타입을 함께 정의해주어야 합니다. 그렇지 않으면 함수 매개변수와 동일하게 암시적 any 타입으로 추론되는데 엄격한 타입 검사 모드(strict 옵션이 true로 설정되어 있을 경우)일 때에는 오류가 발생하게 됩니다. 생성자에서 각 필드의 값을 초기화 하지 않을 경우 초기값도 함께 명시해주어야 합니다. 생성자 함수에서 필드의 값들을 잘 초기화 해 준다면 필드 선언시의 초기값은 생략해도 됩니다. class Employee { // 필드 name: string = ""; age: number = 0; position: string = ""; // 생성자 construc

Naver Blog

[TypeScript]타입스크립트 제네릭(Generic)

타입스크립트 제네릭 - 제네릭 소개 - 타입 변수 응용하기 - map, forEach 메소드 타입 정의하기 - 제네릭 인터페이스 & 제네릭 타입 별칭 - 제네릭 클래스 - 프로미스와 제네릭 제네릭 소개 타입스크립트 제네릭(Generic)은 재사용성을 높이고 다양한 타입에 대해 일반화된 코드를 작성할 수 있도록 도와주는 기능입니다. 제네릭을 사용하면 함수, 클래스, 인터페이스 등에서 타입을 매개변수화하여 유연한 코드를 작성할 수 있습니다. 제네릭 타입은 인터페이스나 클래스, 함수, 타입 별칭 등에 사용할 수 있는 기능으로 해당 심벌의 타입을 미리 지정하지 않고 다양한 타입에 대응하려고 할 때 사용합니다. 제네릭이 필요한 상황 제네릭은 특정 타입을 지정하지 않고, 다양한 타입의 매개변수를 받고 대응하려고 할 때 사용될 수 있습니다. 예를 들어, 다양한 타입의 매개변수를 받고 그대로 반환하는 함수가 있다고 가정합니다. 이후 반환된 값은 any 타입으로 기본 타입의 함수를 호출할 수 없습니

Naver Blog

[TypeScript]타입스크립트 타입 조작하기(인덱스드 엑세스 타입, keyof&typeof 연산자, 맵드 타입, 템플릿 리터럴 타입)

타입스크립트 타입 조작하기 - 인덱스드 엑세스 타입 - keyof & typeof 연산자 - 맵드 타입 - 템플릿 리터럴 타입 인덱스드 엑세스 타입 인덱스드 엑세스 타입(Indexed Access Types)은 타입스크립트에서 객체의 특정 프로퍼티 타입을 동적으로 가져오는 방법입니다. 이는 객체의 특정 프로퍼티에 접근하여 해당 프로퍼티의 타입을 가져올 때 유용하게 사용됩니다. 인덱스를 이용해 다른 타입내의 특정 프로퍼티의 타입을 추출하는 타입 type Person = { name: string; age: number; email: string; }; type PersonAge = Person['age']; // number 타입 객체 프로퍼티의 타입 추출하기 인덱스에는 값이 아니라 타입만 들어갈 수 있습니다. 때문에, 특정 문자열을 값으로 다른 변수에 저장하고 인덱스로 사용하면 오류가 발생합니다. interface Post { title: string; content: string;

Naver Blog

[TypeScript]타입스크립트 조건부 타입(분산 조건부 타입, infer 키워드)

타입스크립트 조건부 타입 - 조건부 타입 소개 - 분산 조건부 타입 - infer 키워드 조건부 타입 소개 타입스크립트에서 조건부 타입(Conditional Types)은 타입의 조건에 따라 다른 타입을 반환하는 기능입니다. 이를 통해 타입을 동적으로 조작하고 유연한 타입 검사를 수행할 수 있습니다. 조건부 타입 문법 조건부 타입은 extends와 삼항 연산자를 이용해 조건에 따라 각각 다른 타입을 정의하도록 돕는 문법입니다. JavaScript의 삼항 연산자는 변수의 값을 조건에 따라 결정하는 것이라면, TypeScript의 조건부 타입은 값 대신 타입을 조건에 따라 결정하는 것이라고 보면 됩니다. T는 타입 변수 또는 타입 표현식을 나타내고, U는 타입의 조건을 나타냅니다. X는 조건이 참일 때 반환되는 타입이고, Y는 조건이 거짓일 때 반환되는 타입입니다. T의 타입이 특정 타입(U)을 확장하는 타입이면 X 타입이 결정되고, 아니라면 Y 타입이 결정된다. T extends U

Naver Blog

[TypeScript]타입스크립트 유틸리티 타입

타입스크립트 유틸리티 타입 - 유틸리티 타입 소개 - 맵드 타입 기반 유티릴티 타입 - 조건부 타입 기반 유틸리티 타입 유틸리티 타입 소개 유틸리티 타입(Utility Types)은 타입스크립트에서 제공하는 미리 정의된 타입 변환 도구입니다. 이러한 유틸리티 타입은 일반적인 타입 조작 작업을 간소화하고 반복적인 작업을 줄여줍니다. 유틸리티 타입은 기존의 타입을 바탕으로 새로운 타입을 만들어내는 타입 연산자입니다. 제네릭, 맵드 타입, 조건부 타입 등의 타입 조작 기능을 이용해 실무에서 자주 사용되는 타입을 미리 만들어 놓은 것 타입스크립트가 자체적으로 제공하는 특수한 타입이다. Partial<T>: T 타입의 모든 속성을 선택적으로 만듭니다. Required<T>: T 타입의 모든 속성을 필수로 만듭니다. Readonly<T>: T 타입의 모든 속성을 읽기 전용으로 만듭니다. Record<K, T>: K 타입의 각 속성을 T 타입으로 매핑하는 객체 타입을 만듭니다. Pick<T, K

Naver Blog

[TypeScript]리액트와 타입스크립트

리액트와 타입스크립트 - CRA 프로젝트를 타입스크립트 프로젝트로 변환하기 - 상태관리와 Props - TODO 리스트 예제 코드 - 외부 라이브러리 사용하기 - 타입스크립트 템플릿 소개 CRA 프로젝트를 타입스크립트 프로젝트로 변환하기 리액트 프로젝트 생성 (CRA) 타입선언 패키지 설치(@types/*) tsconfig.json 생성 모든 JS 파일 확장자를 JSX로 변경 개별 파일을 하나씩 TSX 파일 확장자로 변경하고 타입 오류 해결 1. 리액트 프로젝트 생성 Create React App(CRA)를 통해 리액트 앱을 생성한다. 1. 프로젝트 폴더 생성 $ mkdir react-typescript $ cd react-typescript 2. 리액트 프로젝트 생성 $ npx create-react-app . 3. 필요없는 파일 삭제 - src/setupTests.js - src/reportWebVitals.js - src/logo.svg - src/App.test.js 4. 필

Naver Blog

[Java]try-with-resource (AutoCloseable)

Java try-with-resource (AutoCloseable) - AutoCloseable 인터페이스 - 자동 자원 해제 대상 - JDK 7 버전 이전 자원 해제 - JDK 7 버전 이후 자원 해제 - AutoCloseable 구현 AutoCloseable 인터페이스 AutoCloseable 인터페이스는 JDK 7 버전에 등장하였고, AutoCloseable을 상속받고 있는 구현체가 try-with-resources 구문안에서 선언된 객체들에 대해서 자동으로 자원을 해제(Close)해주는 기능을 제공한다. try-with-resources 문장으로 관리되는 객체에 대해서 자동으로 close() 처리한다. InterruptedException을 던지지 않도록 하는 것을 권장한다. InterruptedException은 쓰레드의 인터럽트 상태와 상호작용하므로 InterruptedException이 억제되었을 때 런타임에서 잘못된 동작이 발생할 수 있다. // try-with-re

Naver Blog

[Java]동적 프록시 기술(JDK 동적 프록시, CGLIB)

Java 동적 프록시 기술(JDK 동적 프록시, CGLIB) - 동적 프록시 기술 - JDK 동적 프록시 - CGLIB 선행해야 할 내용 - 프록시 패턴: https://blog.naver.com/hj_kim97/223105067066 - Java 리플렉션: https://blog.naver.com/hj_kim97/223110095000 동적 프록시 기술 동적 프록시(Dynamic Proxy) 기술은 프로그래밍 언어에서 동적으로 인터페이스 구현체를 생성하는 기술을 말합니다. 주로 자바에서 사용되며, 리플렉션(Reflection)을 기반으로 동작합니다. 동적 프록시는 프록시(Proxy) 객체를 생성하여 실제 객체에 대한 대리자 역할을 수행합니다. 이를 통해 프록시 객체는 실제 객체와 동일한 인터페이스를 구현하며, 호출된 메서드를 가로채고 추가적인 동작을 수행할 수 있습니다. 이러한 추가 동작은 메서드 호출 전후에 전처리(pre-processing)와 후처리(post-processing

Naver Blog

[JavaScript]모듈 시스템(CommonJS, ES Modules) 사용법

JavaScritp 모듈 시스템(CommonJS, ES Modules) 모듈 시스템 모듈 등장 배경 CommonJS ESM(ES6 Modules) HTML ESM(ES6 Modules) 사용하기 모듈 시스템 모듈 시스템은 코드를 독립적인 모듈로 구성하고 재사용하기 쉽도록 하는 기능을 제공하는 기술입니다. 이를 통해 코드를 조직화하고 모듈 간의 의존성을 관리할 수 있습니다. 모듈은 자체적으로 독립적인 파일로 구성되며, 하나의 파일이 하나의 모듈을 나타냅니다. 각 모듈은 고유한 이름을 가지며, 모듈 내에서 정의된 변수, 함수, 클래스 등은 해당 모듈 내에서만 유효합니다. 이렇게 모듈화된 코드는 다른 모듈에서 재사용할 수 있으며, 필요한 모듈만 가져와 사용할 수 있습니다. 분리된 파일 각각을 모듈(Module)이라고 부르고, 모듈은 대개 클래스 하나 혹은 특정한 목적을 가진 복수의 함수로 구성된 라이브러리 하나로 구성됩니다. 모듈 등장 배경 자바스크립트 프로그램은 꽤 작게 시작되었습니다.

Naver Blog

개발자로 살아남기

개발자로 살아남기 저자: 박종천 출판: 골든래빗(주) 발매: 2022/01/01 이 책을 고른 이유 최근 밀리의 서재 구독을 시작했다. 밀리의 서재에서 프로그래밍 관련 키워드로 책을 찾다가 '개발자'라는 키워드로 검색을 하게 됐다. 그 중에서 '개발자로 살아남기' 책의 목차나 리뷰가 괜찮아보여 선택을 하게 됐다. 책의 주요 내용 해당 책의 주요 내용은 30년간 개발자로서 성장하는 방법에 대해서 설명을 한다. 0 ~ 10년 동안에는 주니어 개발자로서 성장하는 방법을 알려주고, 10 ~ 20년 동안에는 중간 관리자의 역할로서 프로젝트를 성공적으로 이끄는 방법과 주니어 개발자들을 성장시키는 방법, 조직에 프로세스를 관리하는 리더십 방법을 알려준다. 20 ~ 30년 동안에는 회사에 최고 관리자의 역할로서 회사의 시스템과 핵심가치를 통해 이룬 사례를 설명하고, 직원을 채용할 때 중요한 점과 실제 블리자드에서 진행한 면접 방법을 알려주고, 마지막으로 기업의 수익을 내기 위한 비즈니스 성장 전략

Naver Blog

[Linux]리눅스 기본 쉘 명령어

리눅스 기본 쉘 명령어 - 쉘(Shell) - 쉘 명령어 - 쉘 스크립트(Shell Script) 쉘(Shell) 쉘(Shell)은 컴퓨터 운영 체제와 사용자 사이에서 상호작용할 수 있는 명령어 인터페이스입니다. 운영 체제는 컴퓨터의 하드웨어와 다른 소프트웨어 사이에서 중재자 역할을 하며, 사용자는 쉘을 통해 운영 체제에 명령을 내릴 수 있습니다. 쉘은 명령어를 입력받아 실행하고, 결과를 사용자에게 표시하는 역할을 합니다. 사용자는 터미널 또는 콘솔 창을 통해 명령어를 입력하면, 쉘은 해당 명령어를 해석하고 실행합니다. 쉘은 명령어 해석기로 작동하며, 사용자가 입력한 명령어를 해석하여 운영 체제에 전달합니다. 일반적으로 리눅스와 유닉스 기반 시스템에서는 Bash(Bourne Again SHell)이 기본적으로 제공되며, 대부분의 사용자가 Bash를 사용합니다. 그러나 다른 쉘도 사용할 수 있으며, 사용자는 쉘을 선택하여 사용할 수 있습니다. 사용자 편의 기능이 필요하지 않은 쉘 스크

Naver Blog

[AWS]리전과 가용 영역(Region, Availability Zone)

AWS 리전과 가용 영역 - 리전(Region) - 가용 영역(Availability Zone) - 엣지 로케이션(Edge Location) 리전(Region) AWS(Amazon Web Services)는 클라우드 컴퓨팅 서비스를 제공하는 아마존닷컴의 서비스입니다. AWS는 전 세계적으로 여러 개의 리전을 운영하고 있습니다. 각 리전은 AWS의 데이터 센터가 위치한 지리적인 영역을 나타냅니다. 각 리전은 독립된 인프라를 가지고 있으며, 고객은 원하는 리전을 선택하여 자원을 프로비저닝하고 서비스를 이용할 수 있습니다. AWS의 서비스가 제공되는 리소스의 지리적 위치 각 리전 간 글로벌 네트워크 백본(Back born) 연결 각 리전에는 고유의 코드가 부여됨 2023년 05월 기준 - AWS 글로벌 인프라(https://aws.amazon.com/ko/about-aws/global-infrastructure/) - 31개 리전 - 99개 가용 영역 - 400개 이상의 엣지 로케이션과

Naver Blog

[AWS]AWS 주요 서비스 소개

AWS 주요 서비스 소개 - 주요 컴퓨팅 서비스(ec2, lambda) - 주요 스토리지 서비스(S3, EBS, EFS) - 주요 네트워크 서비스(VPC, CloudFront, Route53) - 주요 데이터베이스 서비스(RDS, DynamoDB, Elasticache) - 주요 보안 서비스(WAF, Shield, KMS) - 주요 관리형 서비스(Cloudwatch, SNS, EventBridge) 주요 컴퓨팅 서비스(ec2, lambda) AWS EC2(Elastic Compute Cloud) AWS EC2(Elastic Compute Cloud)는 Amazon Web Services(AWS)에서 제공하는 클라우드 컴퓨팅 서비스 중 하나입니다. EC2는 가상 서버를 프로비저닝하고 관리할 수 있는 기능을 제공하여 사용자가 필요에 따라 컴퓨팅 리소스를 유연하게 확장하거나 축소할 수 있도록 합니다. EC2를 사용하면 사용자는 가상 머신(인스턴스)을 시작하고 종료할 수 있으며, 필요에 따

Naver Blog

[Java]리플렉션(Reflection) 개념 및 사용법

Java 리플렉션(Reflection) 개념 및 사용법 - 리플렉션(Reflection) - 리플렉션(Reflection) 장단점 - 리플렉션(Reflection) 사용법 - 리플렉션(Reflection) 사용 예제 - 리플렉션(Reflection) 잘못 사용한 사례 리플렉션(Reflection) 리플렉션(Reflection)은 컴퓨터 과학 용어로, 컴퓨터 프로그램에서 런타임 시점에 사용되는 자신의 구조와 행위 관리하고 수정할 수 있는 프로세스를 의미합니다. JVM은 클래스 정보를 클래스 로더를 통해 읽어와서 해당 정보를 JVM 메모리에 저장합니다. 그렇게 저장된 클래스에 대한 정보가 마치 거울에 투영된 모습과 닮아있어, 리플렉션이라는 이름을 가지게 되었습니다. 런타임(runtime)에 실행 중인 프로그램의 내부 구조를 분석하고 조작할 수 있는 기능 Reflection을 사용하면 프로그램이 자신의 클래스, 필드, 메서드, 생성자 등에 대한 정보를 동적으로 얻을 수 있으며, 이를 통해

Naver Blog

[MyBatis]LOB 데이터 처리(LOB 조회, LOB 저장)

MyBatis LOB 데이터 처리 - 예제 코드용 VO 클래스 - LOB 데이터 저장(INSERT, UPDATE) - LOB 데이터 조회(SELECT) - LOB Object 조회 예제 코드용 VO 클래스 /* LOB(BLOB)안에 byte[] 데이터를 처리하기 위한 VO */ @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class LobVO { private byte[] blobColumn; } /* LOB(CLOB)안에 String 데이터를 처리하기 위한 VO */ @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class BoardVO { private String id; private String title; private String content; } LOB 데이터 저장(INSERT, UPDATE) 바인드 변수에 jdbcType을 직접 명시한다.

Naver Blog

[TypeScript]타입스크립트 기본 개념 정리(탄생 배경, 동작 원리, 프로젝트 생성)

타입스크립트 기본 개념 정리 - 타입스크립트 - 타입스크립트 탄생 배경 - 타입스크립트 동작 원리 - 타입스크립트 프로젝트 생성 - ts-node 패키지 - 타입스크립트 컴파일러 옵션 설정 타입스크립트 타입스크립트(TypeScript)는 JavaScript의 확장된 버전으로, Microsoft에서 개발한 프로그래밍 언어입니다. 타입스크립트는 정적 타입을 지원하며, 이는 개발자가 변수의 타입을 명시적으로 선언할 수 있음을 의미합니다. 이는 코드의 가독성과 유지보수성을 향상시키는 데 도움이 됩니다. 타입스크립트는 JavaScript의 모든 기능을 포함하며, ECMAScript 표준에 따라 작성된 JavaScript 코드는 거의 변경 없이 타입스크립트로 변환할 수 있습니다. 또한, 타입스크립트는 ES6(ECMAScript 2015) 이상의 최신 JavaScript 기능을 미리 사용할 수 있습니다. 타입스크립트는 정적 타입 검사기를 통해 코드의 오류를 사전에 발견할 수 있습니다. 이를 통해

Naver Blog

[TypeScript]타입스크립트 기본 타입 정리(원시타입, 배열, 튜플, Enum, Any, Unknown, Void, Never)

타입스크립트 기본 타입 정리 - 기본타입 - 타입스크립트 기본 문법 - 원시타입과 리터럴타입 - 배열과 튜플 - 객체 - 타입 별칭과 인덱스 시그니처 - Enum 타입 - Any와 Unknown 타입 - Void와 Never 타입 기본타입 기본 타입이란 타입스크립트가 자체적으로 제공하는 타입들을 말합니다. number: 숫자를 나타내는 타입입니다. 정수 및 부동 소수점 숫자를 포함합니다. string: 문자열을 나타내는 타입입니다. 작은 따옴표(')나 큰 따옴표(")로 묶어서 사용합니다. boolean: 참(true) 또는 거짓(false) 값을 나타내는 타입입니다. null 및 undefined: 값이 없음을 나타내는 타입입니다. 각각 null과 undefined라는 별도의 값으로 사용됩니다. object: 객체를 나타내는 타입입니다. 일반적인 자바스크립트 객체를 의미합니다. array: 배열을 나타내는 타입입니다. 여러 개의 값이 순서대로 저장된 컬렉션입니다. tuple: 고정된

Naver Blog

[TypeScript]타입스크립트 타입 호환성 / 타입 추론 / 타입 단언 / 타입 가드

타입스크립트 타입 호환성 / 타입 추론 / 타입 단언 / 타입 가드 - 타입 호환성 - 타입 계층도 - 객체 타입의 호환성 - 대수 타입 - 타입 추론 - 타입 단언 - 타입 가드 타입 호환성 타입 호환성(Type Compatibility)은 타입스크립트에서 변수 할당, 함수 호출 등의 상황에서 타입이 호환되는지 여부를 결정하는 규칙을 의미합니다. 구조적 타이핑 (Structural Typing) 구조적 타이핑은 타입 호환성을 타입의 구조(멤버의 집합)에 기반하여 결정하는 원칙입니다. 타입스크립트는 변수나 객체의 내부 구조가 일치한다면 타입 호환성을 인정합니다. 이름이 다르거나 타입 어노테이션의 형식이 다르더라도, 속성 이름과 타입이 일치하면 호환성이 성립합니다. interface Person { name: string; age: number; } let person: Person = { name: "John", age: 30 }; let person2: { name: string

Naver Blog

[TypeScript]타입스크립트 함수(함수 타입 표현식, 호환성, 오버로딩, 사용자 정의 타입 가드)

타입스크립트 함수 - 함수 - 함수 타입 표현식과 호출 시그니처 - 함수 타입의 호환성 - 함수 오버로딩 - 사용자 정의 타입 가드 함수 함수는 코드 블록을 정의하고, 해당 코드 블록을 실행하기 위해 사용되는 동작 단위입니다. 함수는 특정한 기능을 수행하거나 값을 반환하는 데 사용됩니다. 타입스크립트에서 함수를 정의할 때에는 매개변수와 반환 타입을 명시적으로 지정할 수 있습니다. functionName: 함수의 이름입니다. 함수를 호출하기 위해 사용됩니다. parameter1, parameter2, ...: 함수의 매개변수입니다. 함수가 받는 입력 값으로 사용됩니다. 각 매개변수는 이름과 타입을 가지며, 필요한 만큼 선언할 수 있습니다. type: 매개변수의 타입을 지정합니다. returnType: 함수의 반환 타입을 지정합니다. 함수가 값을 반환하지 않는다면 void 타입을 사용합니다. return value: 함수가 반환하는 값입니다. 반환 타입이 지정되어 있을 때에만 사용됩니다

Naver Blog

[WAS]Window 톰캣(Tomcat) 서버 죽이기

개요 이클립스로 톰캣을 띄우고 작업 중에 어떠한 이유로 이클립스가 갑자기 강제로 종료되었을 때 톰캣 서버가 종료되지 않는 경우가 발생할 수 있다. 이때, 작업 관리자로 이클립스와 Java JVM을 종료하더라도 톰캣 서버가 살아있을 수 있다. 이러한 경우 명령 프롬프트(CMD)로 실행중인(Listening) 포트를 확인하고, 해당 프로세스를 직접 종료시켜준다. ※ 이클립스를 재시작하여 서버(Tomcat)를 실행시키더라도 해당 포트가 이미 사용중이기 때문에 'Serveral ports (포트번호, ..) required by project.포트번호 are already in use.' 이미 사용중 경고를 볼 수 있다. Window 톰캣 서버 죽이기 # 1. 사용중인 포트 확인하기 netstat -nao | findstr "8080" # 2. 프로세스 종료하기 taskkill /f /pid "PID 번호" netstat 명령어 표시 명령어를 입력하면 아래와 같은 순서로 정보가 출력된다.

Naver Blog

[Design Pattern]템플릿 메소드 패턴(Template Method Pattern)

템플릿 메소드 패턴(Template Method Pattern) - 템플릿 메소드 패턴 - 템플릿 메소드 패턴 예제 코드 템플릿 메소드 패턴 템플릿 메소드 패턴이란 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 변경하는 패턴입니다. 어떤 작업을 처리하는 일련의 단계를 정의하고, 이 단계 중 일부를 서브 클래스에서 구현할 수 있게 만든다. 템플릿 메소드 패턴은 이름 그대로 템플릿을 사용하는 방식이다. 즉, 기준이 되는 거대한 틀(변하지 않고 반복되는 코드)을 만들어 놓고 해당 템플릿에서 원하는 부분만 동적으로 변경한다. 1. 추상 클래스(Abstract Class): 템플릿 메소드를 포함하는 추상 클래스를 정의합니다. 2. 템플릿 메소드(Template Method): 추상 클래스 안에 정의된 일련의 작업 단계를 정의합니다. 이 작업 단계 중 일부는 추상 메소드나 오버라이딩 가능한 메소드로 정의됩니다. 3. 구현

Naver Blog

[Design Pattern]전략 패턴(Strategy Pattern)

전략 패턴(Strategy Pattern) - 전략 패턴 - 전략 패턴 예제 코드 - 전략 패턴 예제 코드2 - 템플릿 콜백 패턴 - 템플릿 콜백 패턴 예제 코드 전략 패턴 전략 패턴은 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하며, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 패턴입니다. 전략 패턴은 변하지 않는 부분을 Context 라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결한다. 상속이 아니라 위임으로 문제를 해결하는 것이다. 전략 패턴은 실행 중에 알고리즘을 선택할 수 있도록 하는 패턴입니다. 여러 알고리즘 중에서 실행할 알고리즘을 선택하는 방법은 컨텍스트 객체에 전략 객체를 주입하는 것입니다. 컨텍스트 객체는 전략 객체를 가지고 있고, 실행 시에 전략 객체를 호출

Naver Blog

[Design Pattern]프록시 패턴(Proxy Pattern)

프록시 패턴(Proxy Pattern) - 프록시 패턴 - 프록시 패턴 예제 코드 - 프록시 패턴 예제 코드2 - 데코레이터 패턴 예제 코드 - 데코레이터 패턴 예제 코드2 프록시 패턴 프록시(Proxy)는 대리자, 대변인이라는 의미로 프록시 패턴은 다른 객체를 대신하여 접근할 수 있는 대리자(Proxy) 객체를 제공하는 패턴입니다. 프록시는 원본 객체에 대한 인터페이스를 구현하며, 클라이언트는 프록시를 통해 원본 객체에 접근합니다. 프록시 패턴은 객체 간의 느슨한 결합을 제공하고, 원본 객체에 대한 접근을 제어하거나 부가적인 기능을 추가할 수 있도록 합니다. 이를 통해 코드의 재사용성, 유지보수성, 확장성을 향상시킬 수 있습니다. 접근제어: 권한에 따른 접근 차단, 캐싱, 지연 로딩 부가 기능 추가: 원래 서버가 제공하는 기능에 더해서 부가 기능을 수행한다. (ex: 요청 값이나, 응답 값을 중간에 변형하거나 실행 시간을 측정해서 추가 로그를 남긴다.) ※ GOF 디자인 패턴에서는

Naver Blog

[Linux]리눅스 부팅 및 시스템 관리 데몬

리눅스 부팅 및 시스템 관리 데몬 - 부팅 프로세스 이해 - 시작 서비스 이해 - Systemd 소개 - 시스템 재부팅 및 종료 부팅 프로세스 이해 바이오스(BIOS) BIOS는 "Basic Input/Output System"의 약자로, 컴퓨터 시스템의 하드웨어와 운영 체제(OS) 간의 상호 작용을 담당하는 펌웨어입니다. BIOS는 컴퓨터가 부팅될 때 가장 먼저 실행되는 소프트웨어로, 주로 컴퓨터의 기본 입력과 출력을 관리하며, 하드웨어 초기화, 자체 진단, 부트 로더 로딩 등의 기능을 수행합니다. BIOS는 ROM(Read-Only Memory)에 저장되어 있으며, 컴퓨터 전원을 켤 때 자동으로 실행됩니다. BIOS는 하드웨어를 초기화하고, 주요 장치 및 구성 요소의 동작을 테스트하며, 운영 체제를 로드할 부트 로더를 찾아 실행하는 역할을 수행합니다. 컴퓨터에 전원이 인가되면 실행이 시작되는 최초의 프로그램으로 마더보드에 연결된 디바이스를 초기화하고 검사하는 역할을 수행한다. ※

Naver Blog

[Linux]리눅스 프로세스 관리

리눅스 프로세스 관리 - 프로세스 구성요소 이해 - 프로세스 라이프 사이클 - 스케줄링과 cron 참고하면 좋은 글 프로세스와 쓰레드: https://blog.naver.com/hj_kim97/222961785980 리눅스 크론탭 사용법: https://blog.naver.com/hj_kim97/222660344997 프로세스 구성요소 이해 프로세스(Process) 리눅스에서 프로세스는 실행 중인 프로그램을 나타내는 단위입니다. 각각의 프로세스는 독립적으로 메모리와 시스템 리소스를 할당받아 실행됩니다. 리눅스는 다중 사용자, 다중 작업 환경을 지원하므로 여러 개의 프로세스가 동시에 실행될 수 있습니다. 프로세스는 운영체제로부터 자원을 할당받아 실행되며, 메모리, CPU 시간, 파일, 네트워크 등의 리소스를 사용할 수 있습니다. 각 프로세스는 고유한 프로세스 ID (PID)를 가지며, 이를 통해 식별됩니다. CPU와 메모리를 할당받아 실행 중인 프로그램 프로세스들마다 고유의 프로세스

Naver Blog

[AWS - EC2]기존 시스템 볼륨 추가 및 LVM 디스크 관리

AWS 기존 시스템 볼륨 추가 및 LVM 디스크 관리 - 기존 시스템 볼륨 추가 - LVM 디스크 관리 참고하면 좋은 글 리눅스 파일 시스템 관리: https://blog.naver.com/hj_kim97/222586695771 리눅스 하드디스크 연결(디스크 마운트): https://blog.naver.com/hj_kim97/222917986474 기존 시스템 볼륨 추가 1. 스토리지 볼륨(EBS) 생성 AWS 웹 콘솔을 통해 새로운 볼륨을 추가하고, 생성된 스토리지 볼륨을 가상머신(EC2)과 연결한다. ※ EBS 볼륨은 가용 영역에 종속적인 자원으로 반드시 마운트할 가상머신(EC2)과 동일한 영역으로 생성해야 한다. 1. 스토리지 볼륨 생성 - EC2 서비스 > Elastic Block Store > 볼륨 > 볼륨 생성 - 볼륨 유형: 범용 SSD - 크기(GIB): 10 - 가용 영역: EC2와 동일한 가용 영역 선택 - 태그(선택사항): Key(Name), Value(ebs-t

Naver Blog

[Linux]리눅스 패키지 관리 시스템(rpm, dpkg, yum, apt)

리눅스 패키지 관리 시스템 - 패키지 관리 시스템 - 패키지 관리 시스템 주요 구성 요소 - 리눅스 패키지 설치 과정 - 저수준 패키지 관리 시스템(rpm, dpkg) - 고수준 패키지 관리 시스템(yum, apt-get, apt) - 지정된 버전의 패키지 설치 예제 패키지 관리 시스템 패키지 관리 시스템은 리눅스 시스템에서 소프트웨어 패키지를 관리하고 설치, 업데이트, 제거하는 데 사용되는 도구와 프로세스를 의미합니다. 소프트웨어는 소스코드의 형태로 배포되는 경우와 바이너리 패키지 형태로 배포되는 경우가 있는데, 소스코드의 경우 보통 하나의 아카이브 파일(tar)로 묶은 후 압축하여 배포한다. 바이너리 패키지에는 응용 프로그램, 라이브러리 파일, 버전 정보나 의존성 등의 메타 정보 파일 등이 포함됩니다. 패키지는 저장소(repository)에 저장되어 있으며, HTTP 혹은 FTP 서버를 통해 다운로드 할 수 있습니다. 하나의 패키지가 다른 패키지나 공유 라이브러리 등을 필요로 하

Naver Blog

[Linux]리눅스 시스템 로그 관리(syslog, rsyslog, journal, roglotate)

리눅스 시스템 로그 관리 - 로그(Log) - 로그 관리 정책 - 로그 파일 종류 - syslog와 rsyslog - journal - journalctl - systemd 서비스 구동 앱의 로그 출력 예제 로그(Log) 로그(log)는 시스템 또는 응용 프로그램의 작동 및 이벤트에 대한 기록을 의미합니다. 로그는 일반적으로 중요한 정보, 경고, 오류, 예외 사항 등을 기록하여 시스템 상태를 모니터링하고 문제를 진단하는 데 사용됩니다. 로그는 디버깅, 보안 감사, 성능 분석, 오류 추적 등 다양한 목적으로 활용됩니다. 리눅스 시스템에 관련된 사건이나 커널이나 데몬, 스케줄링, 메일 등 여러 프로그램에서 발생한 이벤트들은 각 서비스별로 구분되어 기록된다. 이때, 발생한 이벤트나 사건에 관련된 기록이 쌓인 파일을 로그라고 부른다. 시스템에 문제가 발생하면 해당 장비와 시간에 기록된 로그 분석을 통해 프로그램에서 발생하는 각종 에러나 경고 메시지를 확인해서 문제를 해결할 수 있다. 때문에

Naver Blog

[스프링 DB 접근 기술]스프링 트랜잭션 전파 (Transactional Propagation)

스프링 트랜잭션 전파 - 스프링 트랜잭션 기본 예제 - 스프링 트랜잭션 전파 - 스프링 트랜잭션 전파 예제 - 다양한 전파 옵션 선행해야 할 내용 스프링 트랜잭션 기본 사용법: https://blog.naver.com/hj_kim97/223091852988 참고하면 좋은 글 Spring 트랜잭션 설정 및 개념: https://blog.naver.com/hj_kim97/222716451210 스프링 트랜잭션 이해: https://blog.naver.com/hj_kim97/223057360694 스프링 트랜잭션 기본 예제 트랜잭션 매니저를 직접 사용하여 트랜잭션을 시작하고 종료시킬 수 있다. 기본적인 트랜잭션을 시작하고, 커밋 혹은 롤백하는 예제를 알아보고 이후에 트랜잭션이 2개 이상일 경우 어떻게 동작하는지 알아본다. 기본 예제 코드 @TestConfiguration: 해당 테스트에서 필요한 스프링 설정을 추가로 할 수 있다. PlatformTransactionManager를 의존성

Naver Blog

[Java]Java 쓰레드 로컬(ThreadLocal)

Java 쓰레드 로컬(ThreadLocal) - 동시성 문제 - 동시성 문제 예제 코드 - ThreadLocal - 쓰레드 로컬 사용 방법 - 쓰레드 로컬 예제 코드 동시성 문제 동시성 문제란 동일한 하나의 공유 자원을 2개 이상의 쓰레드에서 제어할 때 나타나는 문제입니다. 지역 변수를 사용하는 경우에는 동시성 문제가 발생하지 않는다. 또한, 값을 읽기만 하는 경우에는 발생하지 않는다. 전역 변수나 static 같은 공용 필드에 접근할 때 발생한다. 어디선가 값을 변경하고 어디선가 값을 읽을 때 발생한다. 동시성 문제 예제 코드 FieldService 단순히 파라미터로 넘어온 name을 필드인 nameStore에 저장하고, 1초 뒤에 저장된 nameStore를 반환한다. @Slf4j public class FieldService { private String nameStore; public String logic(String name) { log.info("저장 name={} ->

Naver Blog

[스프링 DB 접근 기술]JPA

스프링 DB 접근 기술 JPA - ORM 소개 - JPA 소개 - JAP 설정 - JPA 적용 - JPA Repository 분석 - JPA 예외 변환 선행해야 할 내용 MyBatis: https://blog.naver.com/hj_kim97/223080765467 참고하면 좋은 글 ORM, JPA, Hibernate 개념 정리: https://blog.naver.com/hj_kim97/222663218689 ORM 소개 ORM은 Object-Relational Mapping의 약자로 객체 관계 매핑을 의미합니다. 즉, 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말합니다. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용합니다. 객체 모델과 관계형 모델 간에 불일치가 존재하는데, ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결해줍니다. 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이

Naver Blog

[스프링 DB 접근 기술]스프링 데이터 JPA

스프링 데이터 JPA - Spring Data 소개 - Spring Data 주요 기능 - Spring Data JPA 적용 선행해야 할 내용 JPA: https://blog.naver.com/hj_kim97/223082181460 참고하면 좋은 글 Spring Data JPA 기본 사용법: https://blog.naver.com/hj_kim97/222780110215 Spring Data JPA 쿼리 메소드: https://blog.naver.com/hj_kim97/222791359445 Spring Data 소개 Spring Data의 목적은 기본 데이터 저장소의 특수성을 유지하면서 데이터 접근을 위한 친숙하고 일관된 Spring 기반의프로그래밍 모델을 제공하는 프로젝트입니다. 이를 통해서 데이터 액세스 기술, 관계형 및 비관계형 데이터베이스, 맵 축소 프레임워크 및 클라우드 기반 데이터 서비스를 일관적이고 쉽게 사용할 수 있습니다. 데이터베이스의 종류로는 관계형 데이터베이스(

Naver Blog

[스프링 DB 접근 기술]QueryDSL

스프링 DB 접근 기술 QueryDSL - QueryDSL 소개 - QueryDSL 주요 기능 - QueryDSL 설정 - QueryDSL 적용 - 활용 방안(실용적인 구조, 다양한 데이터 접근 기술 조합) 선행해야 할 내용 스프링 데이터 JPA: https://blog.naver.com/hj_kim97/223082314210 QueryDSL 소개 Querydsl은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크입니다. DSL은 도메인 특화 언어(Domain Specific Language)의 약자로 특정한 도메인에 초점을 맞춘 제한적인 표현력을 가진 컴퓨터 프로그래밍 언어입니다. 즉, QueryDSL은 쿼리에 특화된 프로그래밍 언어를 의미합니다. 문자가 아닌 코드로 쿼리를 작성함으로써 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다. 자동 완성 등 IDE의 도움을 받을 수 있다. 동적인 쿼리 작성이 편리하다. 쿼리 작성 시 제약 조건 등을 메소드 추출

Naver Blog

제어할 수 없는 것에 의존하지 말자[feat. 주식 가치투자]

최근에 주식을 시작했다. 2차전지에 관련된 영상을 보았고, 3 ~ 10배 가까이 되는 주가가 상승하는 것을 보았다. 나는 이미 과열된 상태에서 주식을 시작했다. 아무 정보 없이 급등주에 탔다가 갑자기 급락이 나서 돈을 잃었고 불안한 마음에 팔고나면 또 오르는 모습을 보았다. 돈을 어느정도 잃고나서 주식 유튜브를 찾아보기 시작했다. '이 종목 다음주에 얼마간다.' 이런식의 내용의 영상을 많이 보게 되었고, 이미 많이 오른 종목에 투자를 했다가 불안한 마음에 손해보더라도 다시 뺴고를 반복했다. 지금의 2차전지에 대한 주가는 IRA 법안이 발표된 이후 해당 기업들에 대한 현재 실적보다는 기대 가치 투자로 인해 주가가 많이 상승되었다. 이제 막 급하게 오른 가치 투자는 실적이 나오기까지는 시간이 걸릴 것이다. 또한, 이러한 기업들에 대해서 얼마나 빠르게 성장할지에 대해서 나는 알지 못한다. 물론 2차전지 테마는 계속해서 성장할 것이지만, 이미 호재를 많이 나온 상태에서 실적이 안나오는 경우

Naver Blog

오늘, 또 일을 미루고 말았다.

오늘 또 일을 미루고 말았다. 저자: 나카지마 사토시 출판: 북클라우드 발매: 2017/09/01 이 책을 고른 이유 좋아하는 개발자분들 중 한 분인 향로(이동욱)님의 블로그를 보다가 새로운 책을 출간한 것을 보고 '개발자 원칙' 책을 보게 되었다. 마켓컬리, 레몬트리, 카카오 클라우드, 무신사, 인프런 등 각 기업의 테크 리더를 맡고 있는 9인의 사람마다 자신의 원칙을 설명하는 책으로 개발을 하면서 중요하게 생각하거나, 성장하는 방법에 대해 설명을 하고, 마지막에 해당 원칙에 대해 영감을 받거나 도움이 되었던 책을 챕터마다 소개하게 되어있다. 소개되는 책중에 '오늘, 또 일을 미루고 말았다'라는 책이 있었고, 프로그래머란 어떤 원칙을 가지고 일해야 하며 성과를 내는 프로그래머가 되려면 무엇을 고려해야 하는지 등에 대한 책으로 설명되어 꼭 읽어보고 싶다는 생각을 갖게 되었고, 마침 밀리의 서재에 있어 읽게 되었다. 책의 주요 내용 해당 책은 저자(나카지마 사토시)의 경험을 통해 자신

Naver Blog

[스프링 DB 접근 기술]스프링 트래잭션 기본 사용법

스프링 트랜잭션 기본 사용법 - 스프링 트랜잭션 이해 - 선언적 트랜잭션 관리 - 트랜잭션 예제 - 트랜잭션 옵션 소개 - 예외와 트랜잭션 커밋, 롤백 스프링 트랜잭션 이해 스프링은 트랜잭션 추상화를 제공하여 데이터 접근 기술을 변경하더라도 동일한 트랜잭션 구현 기술을 사용할 수 있도록 한다. 또한, 데이터 접근 기술에 대한 트랜잭션 매니저 구현체로 제공하며, 스프링 부트는 어떤 데이터 접근 기술을 사용하는지 자동으로 인식해서 적절한 트랜잭션 매니저를 선택해서 스프링 빈으로 등록해준다. 선언적 트랜잭션 관리 선언적 트랜잭션 관리는 @Transactional 어노테이션 하나만 선언해서 매우 편리하게 트랜잭션을 적용하는 것을 말한다. @Transactional을 통한 선언적 트랜잭션 관리 방식을 사용하게 되면 기본적으로 프록시 방식의 AOP가 적용된다. 과거에서는 XML을 이용하여 설정하기도 하였다. 다양한 다른 데이터 접근 기술들이 동일한 트랜잭션을 유지하기 위해 스프링 내부에서 트랜

Naver Blog

[스프링 DB 접근 기술]트랜잭션 이해 및 스프링 트랜잭션 기술

트랜잭션 이해 및 스프링 트랜잭션 기술 - 트랜잭션 개념 - 데이터베이스 연결 구조와 DB 세션 - DB 락 개념 - 트랜잭션 사용 예제 - 순수 JDBC 트랜잭션의 문제점 - 스프링에서 제공하는 트랜잭션 기술 - 스프링 트랜잭션 사용 예제 - 스프링 부트의 자동 리소스 등록 - 예외 처리와 반복 문제 해결 (예외 추상화, JdbcTemplate) 트랜잭션 개념 트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미합니다. 만약 데이터베이스의 데이터를 수정하는 도중에 예외가 발생되었다면, DB의 데이터들은 수정이 되기 전의 상태로 다시 되돌아가야 하고, 다시 수정 작업이 진행되어야 합니다. 이렇듯 여러 작업을 진행하다가 문제가 생겼을 경우 이전 상태로 롤백하기 위해 사용되는 것이 트랜잭션입니다. 커밋: 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것 롤백: 작업 중 하나라도 실패해서 이전

Naver Blog

[React]리액트 기초 개념 정리

리액트 기초 개념 정리 - JSX 문법 - React 사용 예제 - useState - 리스트 반복 - 폼 다루기 - useEffect - create-react-app (CRA) JSX 문법 JSX란 JavaScript를 확장한 문법으로 자바스크립트와 html을 동시에 사용하여, HTML 마크업 언어에 자바스크립트 변수들을 바로 사용할 수 있는 일종의 템플릿 언어입니다. JSX로 작성된 코드는 브라우저에서 실행되기 전에 코드가 번들링되는 과정에서 바벨을 사용하여 일반 자바스크립트 형태의 코드로 변환됩니다. ※ 주의점: JSX 문법을 사용할 경우 컴포넌트에 여러 요소가 있을 경우 최상위 요소는 하나여야 합니다. 즉, 부모 요소 하나로 감싸져야 합니다. JSX 내부에서 스타일링을 적용하는 경우 class 대신 className을 사용한다. 또한, style 속성을 적용하기 위해서는 '{}' 내부에 오브젝트를 만들어 해당 오브젝트안에 스타일 속성을 지정하면 된다. (ex: style={

Naver Blog

[스프링 DB 접근 기술]스프링 JdbcTemplate

스프링 JdbcTemplate - 기본 프로젝트 구조 - 스프링 JdbcTemplate - JdbcTemplate - 이름 지정 파라미터 - JdbcTemplate - SimpleJdbcInsert - JdbcTemplate 기능 정리 - Repository 테스트 기본 프로젝트 구조 스프링 JdbcTemplate를 적용하기전 기본 프로젝트 구조로 단순히 메모리에 상품 데이터를 저장하는 프로젝트의 예제이다. build.gradle dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation

Naver Blog

[Tibero DB]JDBC-12003:Unable to open a session.

에러 내용 JDBC-12003:Unable to open a session. java.sql.SQLException: JDBC-12003:Unable to open a session. com.tmax.tibero.jdbc.err.TbError.makeSQLException(Unknown Source) com.tmax.tibero.jdbc.err.TbError.newSQLException(Unknown Source) com.tmax.tibero.jdbc.msg.common.TbMsgError.readErrorStackInfo(Unknown Source) 발생 원인 접속 가능한 최대 세션 숫자를 넘을 경우 발생한다. 즉, 최대 20개의 세션이 접속 가능하다고 가정했을 때 21번째에 접속을 하는 경우 해당 에러가 발생한다. 세션이 종료되지 않는 경우 1. 디버그 모드에서 세션이 실행 중인 경우: 세션이 디버그 모드에서 실행 중인 경우, 세션을 종료시켜도 디버그 모드가 해제되지 않으면 세션

Naver Blog

[스프링 DB 접근 기술]MyBatis

스프링 DB 접근 기술 MyBatis - MyBatis 소개 - MyBatis 설정 - MyBatis 적용 - MyBatis 기능 분석 - MyBatis 기능 정리 선행해야 할 내용 JdbcTemplate: https://blog.naver.com/hj_kim97/223075752334 참고하면 좋은 글 MyBatis 개념 및 연동 방법: https://blog.naver.com/hj_kim97/222617895949 MyBatis 동적 쿼리 문법: https://blog.naver.com/hj_kim97/222651531009 MyBatis Cache 사용 방법: https://blog.naver.com/hj_kim97/222974741854 MyBatis 공식 문서: https://mybatis.org/mybatis-3/ MyBatis 소개 MyBatis란 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있도록 도와주는 개발 프레임워크로 JDBC를 통

Naver Blog

[Spring]파일 업로드 및 다운로드

Spring 파일 업로드 및 다운로드 - HTML 폼 전송 방식 - MultipartResolver - 서블릿과 파일 업로드 - 스프링과 파일 업로드 - 파일 업로드 및 다운로드 예제 HTML 폼 전송 방식 HTML 폼 데이터 전송 방식으로는 'application/x-www-form-urlencoded'와 'multipart/form-data' 2가지가 제공된다. application/x-www-form-urlencoded: 문자 데이터 전송 multipart/form-data: 문자 + 바이너리(파일) 데이터 전송 application/x-www-form-urlencoded 방식 application/x-www-form-urlencoded 방식은 HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법으로 Form 태그에 별도의 enctype 옵션이 없으면 웹 브라우저는 기본적으로 'application/x-www-form-urlencoded' 방식으로 전송하게 된다. 해당 방식

Naver Blog

[스프링 DB 접근 기술]JDBC 이해

스프링 DB 접근 기술 JDBC 이해 - JDBC 이해 - JDBC 사용 예제 JDBC 이해 JDBC는 Java에서 표준으로 제공하는 데이터 접근 API 입니다. 관계형 데이터베이스는 Oracle, MySQL, MSSQL 등 여러가지가 있습니다. JDBC가 제공되기 전에는 각각의 데이터베이스마다 커넥션을 연결하는 방법, Java에서 SQL을 전달하고, 결과를 응답받는 방법이 모두 다르게 됩니다. 즉, 데이터베이스별로 데이터 접근 방법을 공부하고, 새로 구현해야 했습ㄴ디ㅏ. 때문에, Java에서는 공통적인 데이터베이스 접근 기술인 JDBC를 제공합니다. 이것을 통해 데이터베이스 접근 코드는 같게 되고, 실제 접근 기술에 대해서는 데이터베이스 벤더사에서 해당 DB에 맞도록 구현해 놓은 라이브러리(드라이버)를 제공합니다. JDBC 표준 인터페이스를 통해 어떤 RDBMS든지 상관없이 JDBC 표준 사용법만으로 다양한 데이터 베이스에 접근할 수 있다.. 하지만, DB마다 제공하는 SQL 문법

Naver Blog

[스프링 DB 접근 기술]커넥션풀과 데이터소스 이해

스프링 DB 접근 기술 커넥션 풀과 데이터 소스 - 커넥션 풀(Connection Pool, CP) - DataSource 이해 - DataSrouce 사용 예제 선행해야 할 내용 JDBC 이해: https://blog.naver.com/hj_kim97/223053917377 커넥션 풀 데이터베이스 커넥션을 획득할 때는 아래와 같은 복잡한 과정을 거치게 된다. 1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. 2. DB 드라이버는 DB와 'TCP/IP' 커넥션을 연결한다. 이 과정에서 3 Way Handshake와 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다. 3. DB 드라이버는 'TCP/IP' 커넥션이 연결되면 ID/ PW와 기타 부가정보를 DB에 전달한다. 4. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다. 5. DB는 커넥션 생성이 완료되었다는 응답을 보낸다. 6. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에

Naver Blog

[Linux]리눅스 파일 시스템 확인(포맷 확인)

리눅스 파일 시스템 확인(포맷 확인) - df 명령어 - mount 명령어 - /etc/fstab 파일 - fsck 명령어 - file 명령어 - blkid 명령어 df 명령어 df는 disk free의 약자로 디스크 여유 공간을 확인할 수 있는 명령어입니다. df 명령을 사용하면 리눅스 시스템 전체의 (마운트 된) 디스크 사용량을 확인할 수 있습니다. 기본적으로 파일시스템, 디스크 크기, 사용량, 여유공간, 사용률, 마운트지점 순으로 나타납니다. -a: 모든 파일시스템을 출력한다. -h: 보기 편한 용량 크기로 출력한다. (1K, 20M, 2.0G) -H: 블럭 단위를 1024가 아닌 1000단위로 용량을 계산하여 출력한다. -i: i-node의 남은 공간, 사용공간, 사용량을 출력한다. -t [파일타입]: 지정한 파일타입(nfs, ext4 등)만 파일 시스템을 출력한다. -T: 파일타입 항목을 추가하여 출력한다. -x [파일타입]: 지정한 파일타입(nfs, ext4 등)을 제외하

Naver Blog

[Spring]필터와 인터셉터를 이용한 로그인 처리 (Filter, Interceptor, ArgumentResolver)

필터와 인터셉터를 이용한 로그인 처리 - 공통 관심 사항 - 서블릿 필터를 이용한 로그인 처리 - 인터셉터를 이용한 로그인 처리 - ArgumentResolver 활용 선행해야 할 내용 쿠키와 세션을 이용한 로그인 처리: https://blog.naver.com/hj_kim97/223038017794 공통 관심 사항 애플리케이션 여러 로직에서 공통적으로 처리해야 되는 부분을 공통 관심사(cross-cutting concern)라고 합니다. 대부분의 많은 웹 사이트에서는 로그인을 해야 서비스를 이용할 수 있습니다. 때문에, 모든 요청을 받는 부분에 로그인 여부를 검증하는 공통 부분이 존재해야 하는데 모든 컨트롤러에 로그인 검증 로직을 작성하는 것은 매우 비효율적입니다. 이러한 공통 관심사 처리를 위해서 스프링의 AOP, 인터셉터를 이용할 수 있고, 서블릿의 필터를 이용할 수도 있습니다. 웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더나 URL 정보들이 필요한데, 서블릿 필터나

Naver Blog

[Spring]예외 처리와 오류 페이지

예외 처리와 오류 페이지 - Exception(예외) - 서블릿 기본 예외 페이지 - 서블릿 커스텀 예외 페이지 - 서블릿 예외 처리 - 필터 - 서블릿 예외 처리 - 인터셉터 - 스프링 부트 - 오류 페이지 선행해야 할 내용 Java 예외 처리: https://blog.naver.com/hj_kim97/222389015969 Exception(예외) Java Application Exception Java의 main 메소드를 직접 실행하는 경우 'main' 이라는 이름의 쓰레드가 실행된다. 만약, 실행중에 발생한 예외를 잡지 못하고 main 메소드를 넘어서 예외가 던져지는 경우 예외 정보를 남기고 해당 쓰레드가 종료된다. 즉, 예외를 잡지 못하고 던져지면 애플리케이션이 종료된다. Web Application Exception 웹 애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고 서블릿 컨테이넝 안에서 실행된다. 만약, 사용자의 요청으로 별도의 쓰레드가 할당되고 해당 쓰레드에서

Naver Blog

[Spring]API 예외 처리

API 예외 처리 - API 예외 처리 개요 - 스프링 부트 기본 오류 처리 - HandlerExceptionResolver - 스프링 부트 기본 ExceptionResolver - ResponseStatusExceptionResolver - DefaultHandlerExceptionResolver - @ExceptionHandler - @ControllerAdvice 선행해야 할 내용 예외 처리와 오류 페이지: https://blog.naver.com/hj_kim97/223040024768 Spring Exception Handling: https://blog.naver.com/hj_kim97/222838956315 API 예외 처리 개요 API 요청 관련된 에러인 경우 단순히 오류 페이지를 보여주는 것이 아닌, 각 오류 상황에 맞는 오류 응답 스팩을 정하고 JSON으로 데이터를 내려주어야 합니다. 쉽게, 브라우저를 통해 클라이언트가 화면을 주고 받는 경우에는 오류 페이지를 반환해

Naver Blog

[Spring]스프링 타입 컨버터와 포맷터 (Converter, Formatter)

스프링 타입 컨버터와 포맷터 - 타입 컨버터 개요 - Converter 인터페이스 - ConversionService 인터페이스 - Formatter 인터페이스 - FormattingConversionService - 스프링이 제공하는 기본 포맷터 - 정리 타입 컨버터 개요 기본적으로 HTTP 요청 파라미터는 모두 문자로 들어온다. 따라서 요청 파라미터를 자바에서 다른 타입으로 변환해서 사용하고 싶으면 다른 타입으로 변환하는 과정을 거쳐야 한다. 즉, HttpServletRequest를 이용하여 요청 파라미터를 사용할 경우 기본적으로 문자 타입으로 조회하고, 원하는 타입으로 변경해주어야 한다. 하지만, 스프링에서 제공하는 @RequestParam, @ModelAttribute, @PathVarialbe 같은 어노테이션을 사용하면 스프링이 내부적으로 타입 컨버터를 이용하여 문자형 타입을 지정한 타입으로 변환하여 넣어준다. 쉽게, 쿼리스트링이나 HTML Form으로 파라미터를 요청한 경

Naver Blog

[Spring]Thymeleaf 템플릿 조각과 레이아웃(레이아웃 나누기)

Thymeleaf 템플릿 조각과 레이아웃 - 템플릿 조각 - 템플릿 레이아웃 - 템플릿 레이아웃 확장 - 템플릿 레이아웃 플러그인 선행해야 할 내용 Thymeleaf 소개 및 환경 설정 : https://blog.naver.com/hj_kim97/222936919616 Thymeleaf 기본 사용법: https://blog.naver.com/hj_kim97/223031615864 템플릿 조각 웹페이지를 개발을 하게되면 상단 영역(Header), 하단 영역(Footer) 등 공통 영역이 많이 있습니다. HTML 파일마다 이렇게 공통되는 부분을 복사해서 사용한다면 변경시 모든 HTML 파일을 수정해야 하므로 상당히 비효율적입니다. 타임리프는 이런 문제를 해결하기 위해 템플릿 조각과 레이아웃 기능을 지원합니다. th:fragment="이름" 속성을 추가하면 템플릿 조각이되어 다른 곳에서 불러와 사용이 가능해진다. th:insert, th:replace로 템플릿 조각을 가져와 불러올 수 있

Naver Blog

[Spring]Thymeleaf(타임리프) 스프링 통합과 폼 (form 관련 기능 정리)

Thymeleaf 스프링 통합과 폼 - 타임리프 스프링 통합 - 입력 폼 처리 - 요구사항 추가 - 체크 박스 - 단일(히든 필드) - 체크 박스 - 단일 - 체크 박스 - 멀티 - 라디오 버튼 - 셀렉트 박스 타임리프 스프링 통합 타임리프는 스프링이 없어도 동작하지만, 스프링과 함께 사용하면 타임리프와 스프링과 통합을 위한 다양한 기능을 편리하게 제공합니다. 기본 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 스프링 통합 메뉴얼: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html 스프링 통합으로 추가되는 기능 - 스프링의 SpringEL 문법 통합 - ${@myBean.doSomething()} 처럼 스프링 빈 호출 지원 - 편리한 폼 관리를 위한 추가 속성 - th:object (기능 강화, 폼 커맨드 객체 선택) - th:field ,

Naver Blog

[Spring]메시지, 국제화(Message, Internationalization)

스프링 메시지, 국제화(Message, Internationalization) - 메시지 - 국제화 - 메시지 소스 설정 - 메시지 소스 사용하기 메시지 화면에서 공통으로 사용되는 다양한 메시지를 한 곳에서 관리하는 기능을 메시지 기능이라고 합니다. 만약, HTML에 하드코딩으로 문구가 적혀있는 경우 특정 문구가 변경되었을 때 해당 문구가 사용되는 모든 파일을 찾아 수정해주어야 합니다. 스프링에서는 다양한 메시지를 한 곳에서 관리하고 화면(View)에서 정의된 메시지를 사용할 수 있는 메시지 기능을 제공합니다. messages.properties 라는 메시지 관리용 파일을 만들고, HTML안에서 Key 값으로 해당 데이터를 불러올 수 있다. 쉽게, 여러 페이지에서 사용하는 다양한 메시지를 한 곳에서 관리하는 기능이다. <!-- 기존 코드 --> <label for="itemId">상품 ID</label> <input type="text" th:field="${item.id}" rea

Naver Blog

[Spring]Validation(데이터 유효성 검증)

Spring Validation(데이터 유효성 검증) - 프로젝트 기본 정보 - 검증 직접 처리 - BindingResult - BindingResult를 이용하여 검증하기 - FieldError와 ObjectError - BindingResult를 이용한 검증 개선하기 - 오류 코드와 메시지 처리 - rejectValue, reject 메소드 - 오류 코드와 메시지 처리 개선 - rejectValue, reject 메소드 - MessageCodesResolver 인터페이스 - rejectValue, reject 메소드 동작 방식 - 오류 코드와 메시지 처리 개선 - 타입 오류 - Validator 분리 - Validator 인터페이스 - Validator 분리 - WebDataBinder - @Validated와 @Valid 참고하면 좋은 글 Spring Validation(데이터 유효성 검증): https://blog.naver.com/hj_kim97/222838863332 프로

Naver Blog

[Spring]Bean Validation

Bean Validation - Bean Validation - Bean Validation 사용 준비 - Bean Validation 사용 예제 - Bean Validation - 스프링 적용 - Bean Validation - 에러 코드 - Bean Validation - 오브젝트 오류 - Bean Validation - 한계 - Bean Validation - groups - Form 전송 객체 분리 - Form 전송 객체 분리 - 개발 - Bean Validation - JSON 데이터 선행해야 할 내용 Spring Validation(데이터 유효성 검증): https://blog.naver.com/hj_kim97/223034858427 Bean Validation Bean Validation은 Java에서 지원하는 기술 표준(JSR-380)으로 인터페이스로 제공되어 실제 구현체로는 보통 Hibernate Validator를 사용합니다. 쉽게, Java에서 검증에 대한 기능을

Naver Blog

[Spring]쿠키와 세션을 이용한 로그인 처리

쿠키와 세션을 이용한 로그인 처리 - 프로젝트 기본 정보 - 쿠키를 이용한 로그인 처리 - 쿠키와 보안 문제 - 세션을 이용한 로그인 처리 (직접 구현) - 서블릿 세션을 이용한 로그인 처리 - TrackingModes - 세션 타임아웃 설정하기 선행해야 할 내용 Spring Validation: https://blog.naver.com/hj_kim97/223036873193 프로젝트 기본 정보 예제 코드로 사용될 프로젝트의 기본 내용입니다. 1. 의존 라이브러리 dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' compileOnly

Naver Blog

[TIL]Nginx를 이용한 애플리케이션 무중단 배포

Nginx를 이용한 애플리케이션 무중단 배포 - 무중단 배포를 위한 환경 이해하기 - Nginx를 통한 로드밸런싱 구성 - Artillery를 이용하여 성능 측정하기 선행해야 할 내용 - GCP 도커 및 Jenkins 배포: https://blog.naver.com/hj_kim97/223028332820 무중단 배포를 위한 환경 이해하기 애플리케이션의 변경 사항을 수정한 후 배포를 진행하게 될 경우 서버를 종료시키고, 재실행하는 과정이 일어나게 됩니다. 이때, 서버를 내리고 올리는 시간동안 사용자는 서비스를 이용할 수 없습니다. 즉, 서비스 중단 배포가 진행된 것입니다. 이러한, 서비스 재실행은 종료부터 실행까지 길게는 1분 가량이 소요될 수 있습니다. 이러한 배포 과정에서 중단 현상을 해결하기 위해 애플리케이션 서버를 2대 이상으로 늘리고, 애플리케이션 서버와 사용자 사이에 중계를 진행하는 웹 서버를 하나 생성합니다. (Reverse Proxy) 리버스 프록시: 클라이언트가 Web

Naver Blog

[TIL]Github Webhook과 jenkins로 배포 자동화하기

Github Webhook과 jenkins로 배포 자동화하기 - Github Webhook이란? - Github Webhook 설정 - Jenkins 설정 참고하면 좋은 글 Git 사용법 총정리: https://blog.naver.com/hj_kim97/222869706823 웹훅(Webhook)이란?: https://blog.naver.com/hj_kim97/222431987094 Github Webhook이란? 깃헙에서는 특정 이벤트가 발생하면 다른 URL로 API 호출을 해주는 기능을 제공합니다. Github Webhook으로 Jenkins의 URL을 등록하고, Jenkins는 Gtihub의 API 호출을 받으면 Github 저장소의 소스코드를 다운로드 받고, 해당 소스코드를 빌드하여 jar 파일로 만들고, 만들어진 jar 파일을 배포 스크립트를 통해 배포 자동화를 할 수 있습니다. 즉, 로컬에서 소스 코드를 작업하고 Github으로 push만 하면 자동으로 새로운 소스 코드로

Naver Blog

[TIL]I/O bound 애플리케이션

I/O bound 애플리케이션 - I/O bound 애플리케이션도 서버를 늘리면 성능을 올릴 수 있을까? - DB를 이용한 한 줄 게시판 만들기 - Git Flow 전략 사용 예시 - Artillery를 이용한 성능 테스트 참고하면 좋은 글 CPU 테스트, GCP Docker 및 Jenkins 배포: https://blog.naver.com/hj_kim97/223028332820 Nginx를 이용한 애플리케이션 무중단 배포: https://blog.naver.com/hj_kim97/223028541845 Github Webhook과 Jenkins로 배포 자동화: https://blog.naver.com/hj_kim97/223030288576 I/O bound 애플리케이션도 서버를 늘리면 성능을 올릴 수 있을까? CPU bound 애플리케이션 하드디스크에 저장되어 있던 프로그램이 메모리에 올라가게 되면 프로레스가 되고, 스케줄러에 의해 실행될 프로세스가 CPU에 올라가 실행이 된다.

Naver Blog

[TIL]Message Queue를 도입하여 데이터 유실 방지

Message Queue를 도입하여 데이터 유실 방지 - 서버가 죽는 이유와 Message Queue를 도입하여 얻을 수 있는 장점 - RabbitMQ 도입과 글 목록 캐싱 - Message Queue 정리 서버가 죽는 이유와 Message Queue를 도입하여 얻을 수 있는 장점 1. 서버가 죽는 이유? 서버가 죽었다라는 용어를 증상으로 나누어 보면 일부 요청이 실패하는가, 모든 요청이 실패하는가로 나눠볼 수 있습니다. 이러한 원인은 네트워크 장애, DB 장애 등 여러가지로 나눠볼 수 있습니다. CPU 바운드 애플리케이션에서는 CPU를 과도하게 사용하는 Hash 연산을 다량 요청했을 때 요청이 실패 DB I/O 바운드 애플리케이션에서는 DB로 요청하는 쿼리를 다량 요청했을 때 요청이 실패 2. 톰캣 구조 살펴보기 사용자의 요청은 우선 큐에 들어가고, 큐에 들어간 요청이 놀고 있는(Idle) 쓰레드가 있다면 그 쓰레드에 할당되어 처리된다. 쓰레드가 처리하는 양보다 들어오는 요청이 많

Naver Blog

[TIL]검색과 분석을 위한 저장소 ElasticSearch(ES)

검색과 분선을 위한 저장소 ElasticSearch(ES) - Elastic Search란? - Database와 ElasticSearch는 어떻게 다른가? - ElasticSearch 기본 용어 - ElasticSearch와 RDB 용어 비교 - Spring Boot 프로젝트에 Elastic Search 도입 Elastic Search란? 엘라스틱 서치(ElasticSearch)는 루씬 기반의 검색 엔진입니다. 즉, 엘라스틱 서치는 검색, 분석, 데이터 저장소 역할을 합니다. 엘라스틱 스택: 데이터 분석에 필요한 모든 유형의 데이터를 실시간으로 검색, 분석 및 시각화를 할 수 있는 Elastic 사의 오픈소스 데이터 분석 플랫폼을 말합니다. 비츠(Beats): 서버에 에이전트 형식으로 설치하는 오픈소스 데이터 수집기로 데이터를 ES에 직접 전송할 수 있으며, Logstash를 통해서 데이터를 전송할 수도 있습니다. 로그스태시(Logstash): 오픈 소스 서버의 데이터 처리 파이프

Naver Blog

[Spring]Thymeleaf(타임리프) 기본 사용법 정리

Thymeleaf(타임리프) 기본 사용법 정리 - 프로젝트 생성 및 기본 세팅 - 타임리프 소개 - 기본 표현식 - 텍스트 - text, utext - 변수 - SpringEL - 기본 객체들 - 유틸리티 객체와 날짜 - URL 링크 - 리터럴 - 연산 - 속성 값 설정 - 반복 - 조건부 평가 - 주석 - 블록 - 자바스크립트 인라인 프로젝트 생성 및 기본 세팅 1. 프로젝트 만들기 Spring initializr: https://start.spring.io/ Project: Gradle-Groovy Language: Java Spring Boot: 2.7.9 Project Metadata: - Group: hello - Artifact: thymeleaf-basic - Name: thymeleaf-basic - Description: Demo project for Spring Boot - Package name: hello.thymeleaf - Packaging: Jar - Ja

Naver Blog

[MyBatis]Error parsing XPath '/sqlMap/select'. Cause: java.util.NoSuchElementException 에러

에러 내용 nested exception is com.ibatis.common.xml.NodeleteException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMap/select'. Cause: java.util.NoSuchElementException 발생 원인 iBatis 혹은 MyBatis 사용 중에 XxxMapper.xml SQL 문 파싱 오류 보통 파라미터 매핑시 '#'이 들어가는 부분에 대해 오타가 났을 경우 발생 ex) '##name#', '#name' MyBatis를 쓰는 경우 iBatis 문법인 '#name#'을 사용하는 경우 파싱 에러 발생 iBatis를 쓰는 경우 MyBatis 문법인 '#{name}'을 사용하는 경우 파싱 에러 발생 Error parsing XPath '/sqlMap/select' 라면 select 문 확인 Error parsing XPath '

Naver Blog

[Linux]Docker 설치 및 실행하기

Linux Docker 설치 및 실행하기 - 도커(Docker) 설치하기 - Docker 실행해보기 참고하면 좋은 글 GCP 계정 생성 및 인스턴스 만들기: https://blog.naver.com/hj_kim97/223028118056 도커(Docker) 설치하기 1. 레드햇 계열 리눅스 Docker 설치 yum을 이용하여 Docker를 설치합니다. RedHat, Fedora, CentOS # 만약 기존에 도커가 설치되어있다면 삭제 후 진행 # 이전 버전의 Docker는 'docker', 'docker-engin'이라는 이름으로 사용되었습니다. $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 1. Docker Repository 설정 # 1-1. '

Naver Blog

[TIL]CPU 테스트, GCP Docker 및 Jenkins 배포

CPU 테스트, GCP Docker 및 Jenkins 배포 프로그램과 프로세스의 차이 Artillery를 활용한 스트레스 테스트 Dockerized 애플리케이션 GCP에 배포하기 Jenkins를 이용해서 배포하기 프로그램과 프로세스의 차이 컴퓨터의 주요 부품으로는 하드디스크(HDD), 메모리(RAM), CPU가 있습니다. 프로그램(이하 애플리케이션)은 하드디스크(HDD)에 존재합니다. 하드디스크에 있는 프로그램을 실행시키면 메모리(RAM)에 저장됩니다. 이것은 프로세스라고 합니다. 메모리(RAM)에 올라가있는 프로세스 중 일부는 CPU에 의해 실행됩니다. 이때, CPU Scheduling을 통해 어떤 프로세스가 시스템의 자원을 할당받는지 결정됩니다. 즉, 어떤 프로세스가 실행될 지 결정됩니다. 메모리가 존재하는 이유 하드디스크는 굉장히 느립니다. 때문에, CPU가 프로세스를 실행시키기 위해 하드디스크에 직접 요청을 하게 되면, CPU가 아무리 빠르더라도 하드디스크 I/O 속도가 굉장

Naver Blog

[Jenkins]관리자 비밀번호 재설정

Jenkins 관리자 비밀번호 재설정 - 개요 - Jenkins 관리자 비밀번호 재설정 개요 Jenkins를 처음 실행시 플러그인 설치 및 배포 스크립트를 설정하는 것은 무척이나 오래걸립니다. 이때, 처음 설정시 이후에 비밀번호를 까먹은 경우에 Jenkins 설정 파일의 옵션을 변경하면 비밀번호 없이 접속할 수 있습니다. Jenkins 관리자 비밀번호 재설정 1. Jenkins 설정 파일 수정 useSecurity 옵션을 false로 변경한다. vi 편집기로 접속 후 'i'를 입력하면 입력모드로 변경되고, 저장할 때는 ESC 클릭 후 ':wq' 입력한다. # Jenkins 설정 파일 수정 $ sudo vi /var/lib/jenkins/config.xml <!-- Before --> <?xml version='1.1' encoding='UTF-8'?> <hudson> <disabledAdministrativeMonitors/> <version>2.375.3</version> <num

Naver Blog

[C++]C++ STL(표준 템플릿 라이브러리) 사용법 (Vector, Map 예시)

C++ STL(표준 템플릿 라이브러리) 사용법 - STL이란? - STL의 구성 요소 · 컨테이너(container) · 반복자(iterator) · 알고리즘(algorithm) - Vector 사용 예시 - Map 사용 예시 STL이란? STL이란 Standard Template Library의 약자로 표준 템플릿 라이브러리를 말합니다. 쉽게, C++에서 제공되는 표준 컨테이너 클래스 템플릿 라이브러리입니다. 벡터, 리스트, 스택, 큐 등의 컨테이너와 이들을 처리하기 위해 사용할 수 있는 여러 가지 연산을 포함합니다. STL의 구성 요소 C++ 표준 템플릿 라이브러리인 STL은 다음과 같은 구성 요소로 이루어진 템플릿을 제공합니다. 컨테이너(container): 데이터 저장 반복자(iterator): 포인터의 역할 알고리즘(algorithm): 데이터 처리 가능 컨테이너(container) STL에서 컨테이너(container)는 같은 타입의 여러 객체를 저장하는 일종의 집합이라고

Naver Blog

[C++]C++ 예외처리(Exception Handling)

C++ 예외처리(Exception Handling) - 예외(exception) - 예외처리(exception handling) - try, catch, throw문 - 예외 처리 사용법 - 예외처리 주의점 - 스마트 포인터(smart pointer) - 예외 클래스 - 표준 예외 클래스 - 처리되지 않은 예외 예외(exception) 예외(exception)란 컴퓨터 시스템이 동작하는 도중에 예상하지 못한 오류가 발생하여, 실행되고 있던 프로그램이 중지되는 것을 의미합니다. 프로그램 실행 도중에 발생할 수 있는 비정상적인 사건 예외 상황에 대해 적절한 대비를 하지 않으면 프로그램이 안정적으로 실행되지 않는 문제가 일어날 수 있음 예외처리(exception handling) 예외 처리(exception handling)는 이러한 예외 상황을 처리할 수 있도록 코드의 흐름을 바꾸는 행위를 의미합니다. 프로그램 실행 중 예외가 발생하였을 때를 대비하여 마련해 놓은 처리 절차를 따라 대응

Naver Blog

[Linux]리눅스 tar 명령어 사용법(파일 아카이브와 압축)

리눅스 tar 명령어 사용법 - 파일 아카이브(Archive) - 압축(Compression) - tar 명령어 파일 아카이브(Archive) 아카이브(Archive)란 사전적 의미로 역사적 가치 혹은 장기 보존의 가치를 가진 기록이나 문서들의 컬렉션을 의미하며, 동시에 이러한 기록이나 문서들을 보관하는 장소, 시설, 기관 등을 의미합니다. 리눅스에서 아카이브(Archive)란 여러 개의 파일이나 디렉토리들을 하나의 파일로 묶는 것을 말합니다. 아카이브는 단순히 파일의 용량은 줄어들지 않고, 여러 개의 파일들을 하나로 모으는 것을 의미합니다. 쉽게 말하자면, 아카이빙을 통해 여러 개의 파일들이 묶인 *.tar 파일이 생성됩니다. 그리고 *.tar 파일을 복원하면, 기존에 파일과 폴더 구조를 유지한 원본 파일을 얻을 수 있습니다. 압축(Compression) 파일의 크기를 작게 만드는 것을 압축(compression) 이라고 합니다. 기존 파일의 크기를 압축하고, 원래대로 돌리는 것이

Naver Blog

[Gradle]Groovy 문법 요약 정리 (클래스, 메소드, 클로저, 조건문, 반복문)

Groovy 문법 요약 정리 - Groovy란? - Groovy 문법 · 생략 가능한 구문들 (Import Statement) · 세미콜론 (Semicolons) · 메소드 (Parentheses) · Getters and Setters · 접근 제어자 (Access Modifiers) · 체크 예외 (Checked Exceptions) · 변수 선언과 값 할당 · 리스트와 맵 데이터 다루기 (Collective Data Types) · 조건문 · 반복문 · 클로저 (Closure) · 클래스 (Class) · Assertions · 동일성, 동등성 검사 Groovy란? 그루비(Groovy)는 JVM에서 실행되는 언어로 자바에 파이썬, 루비, 스몰토크 등의 특징을 더한 동적 객체 지향 프로그래밍 언어입니다. 문법이 Java에 매우 비슷하며, Java와 호환이 되고, Java 클래스 파일을 그대로 Groovy 클래스로 사용할 수 있습니다. Groovy 문법 생략 가능한 구문들 (Imp

Naver Blog

[Gradle]build.gradle 작성 방법 및 동작 원리 (Gradle 명령어, Gradle 프로젝트 구조, task 정의)

build.gradle 작성 방법 및 동작 원리 - Gradle이란? - Gradle 프로젝트 구조 - Gradle 명령어 - Gradle task 정의 - build.gradle 프로퍼티 - build.gradle 메소드 Gradle이란? 그래들(Gradle)은 그루비(Groovy)를 기반으로 한 빌드 도구입니다. Ant와 Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈 소스로 공개된 빌드 도구입니다. Gradle 공식 사이트: https://gradle.org/ Github 공식 문서: https://github.com/gradle/gradle 그루비(Groovy) 기반의 빌드 자동화 도구 XML 기반의 Maven 보다 동적인 빌드를 유연하게 표현할 수 있으며, 가독성이 좋습니다. Gradle 프로젝트 구조 Gradle 프로젝트 구조는 아래와 같습니다. Gradle 프로젝트 초기화 명령어: gradle init --type java-applic

Naver Blog

[Spring]Thymeleaf 소개 및 환경 설정

Thymeleaf 소개 및 환경 설정 - Thymeleaf란? - Thymeleaf 환경 설정 · Spring Legacy xml · Java Config · Spring Boot Themeleaf란? Thymeleaf란 뷰 템플릿 엔진으로 컨트롤러가 전달하는 데이터를 이용하여 동적으로 화면을 구성할 수 있게 합니다. Thymeleaf 공식 사이트: https://www.thymeleaf.org/ 서버 사이드 HTML 렌더링(SSR): 타임리프는 백엔드 서버세엇 HTML을 동적으로 렌더링하는 용도로 사용됩니다. 네츄럴 템플릿: 타임리프는 순수한 HTML을 최대한 유지하려는 특징이 있습니다. JSP와의 큰 차이점으로 타임리프로 작성한 파일의 확장자는 .html이고, 웹 브라우저에서 직접 파일을 열어 내용을 확인할 수 있습니다. 스프링 통합 지원: 타임리프는 스프링과 자연스럽게 통합되어 스프링의 다양한 기능을 쉽게 사용할 수 있습니다. <!DOCTYPE html> <html xmlns:

Naver Blog

[Spring]객체 지향 설계와 스프링(스프링 탄생 배경, 객체 지향 프로그래밍, SOLID 원칙)

객체 지향 설계와 스프링 - EJB의 한계 - Hibernate의 탄생 - Spring의 탄생 - 스프링(Spring)이란? - 스프링 프레임워크(Spring Framework) - 스프링 프레임워크의 특징 및 주요 모듈 - 스프링 부트(Spring Boot)란? - 스프링과 객체 지향 - 객체 지향 프로그래밍이란? · 객체 지향 프로그래밍이란? · 다형성(Polymorphism) · 오버라이딩(overriding) · 역할과 구현을 분리 · 다형성의 본질 · 한계점 · 스프링의 핵심 - 좋은 객체 지향 설계의 5가지 원칙(SOLID) 스프링의 탄생 배경 EJB EJB란 Enterprise Java Beans의 약자로 엔터프라이즈급 애플리케이션 개발을 단순화하기 위해 발표한 스팩입니다. Java Bean이란 자바 객체를 재사용 가능하게 컴포넌트화 시킬 수 있는 코딩 방침을 정의한 것을 의미합니다. 즉, EJB는 애플리케이션에서 비즈니스와 관련된 객체가 많기 때문에, 비즈니스 객체들을

Naver Blog

[C++]C++ 연산자 다중 정의

C++ 연산자 다중 정의 - C++ 연산자 다중 정의 - 단항 연산자 다중 정의 - 이항 연산자 다중 정의 - 스트림 출력 연산자 다중 정의 - [] 연산자 다중 정의 - 형 변환 연산자 다중 정의 C++ 연산자 다중 정의 사용자가 선언한 클래스에서 C++에 정의된 연산자를 의미와 목적에 맞게 다중 정의하여 사용할 수 있습니다. 객체에 대해서 + 라는 연산에 곱(*)하거나 빼기(-)로 재정의할 수도 있지만, 연산자의 의미 자체를 바꾸는 것은 옳지 않습니다. 때문에, 연산자의 고유한 특성이 유지되도록 합니다. 클래스의 멤버로 정의하는 방법과 클래스 외부에서 정의하는 방법이 존재합니다. 클래스 외부에서 정의할 경우 클래스의 멤버가 아니기 때문에, 객체의 private 멤버는 직접 사용할 수 없습니다. (friend 키워드 혹은 멤버 접근 함수를 생성하여 사용) 단항 연산자인 ++와 -- 연산자는 전위 표기와 후위 표기 각각에 대해 다중 정의가 가능합니다. 이항 연산자의 다중 정의는 좌측

Naver Blog

[iBatis]java.sql.SQLException: Invalid parameter object type 에러

에러 내용 java.sql.SQLException: Invalid parameter object type. Expected 'java.util.HashMap' but found 'java.lang.String'. 잘못된 매개 변수 개체 유형. 'java.util.HashMap'을 예상했지만 'java.lang.String'을 발견했다. 발생 원인 iBatis 사용시 *Dao.xml에 parameterClass로 명시한 타입과 실제 Dao 쿼리를 수행할 때 넘겨주는 파라미터 타입이 다른 경우 발생 Expected 'java.util.HashMap' but found 'java.lang.String'은 HashMap을 paramaterClass로 정의했지만, String 타입을 넘겨주어서 발생합니다. 해결 방안 xml 파일에 parameterClass의 타입을 변경 Expected 'java.util.HashMap' but found 'java.lang.String' parameterC

Naver Blog

[C++]C++ 상속 (기초 클래스, 파생 클래스, 추상 클래스)

C++ 상속 - 상속(inheritance) - 파생 클래스(derived class) - 파생 클래스의 생성자 및 소멸자 - 가시성 지시어 및 상속 - final 클래스 - 이름 은폐 - 클래스 계층구조와 포인터 - 가상함수 - 가상 소멸자 - 업 캐스팅과 다운 캐스팅 - 추상 클래스 상속(inheritance) 객체지향 언어에서 상속은 계층관계를 사용하여 클래스 간의 속성 및 함수를 공유할 수 있도록 지원하는 매우 중요한 개념입니다. 상속은 사용자에게 높은 수준의 코드 재활용성을 제공하며, 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련합니다. 기존에 정의되어 있던 클래스를 기초 클래스(base class) 또는 부모 클래스(parent class), 상위 클래스(super class) 라고도 합니다. 상속을 통해 새롭게 작성되는 클래스를 파생 클래스(derived class) 또는 자식 클래스(child class), 하위 클래스(sub class) 라고도

Naver Blog

[C++]템플릿(template) 사용법 & 예제

템플릿(template) 사용법 & 예제 - 컨테이너 클래스(Container Class) - 템플릿(Template) - 비자료형 템플릿 매개변수 - 함수 템플릿 컨테이너 클래스(Container Class) 컨테이너(container) 클래스란 다른 객체를 저장하는 클래스로서, 그 예로 스택, 큐, 배열, 리스트 등이 있습니다. 만약, int형 자료를 저장할 수 있는 컨테이너 클래스인 스택을 만든다고 할 때, 아래와 같이 될 수 있습니다. 이때, 다른 자료형을 저장하는 스택이 필요하다면 예약어(typedef)로 지정한 자료형을 변경하거나, 예약어만 변경한 동일한 코드의 스택 클래스를 또 생성해야 합니다. 다른 자료형을 저장하는 컨테이너 클래스를 만들고자 할 때마다 클래스를 새로 작성해야 합니다. (중복 코드) #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED typedef int STACK_ITEM; class Stack { private:

Naver Blog

[WEB]JWT 토큰 인증이란?(쿠키, 세션, 토큰, JWT 토큰 인증)

JWT 토큰 인증이란? - HTTP의 특징과 쿠키와 세션을 사용하는 이유 - 쿠키(Cookie) - 세션(Session) - 쿠키와 세션의 차이 - 세션을 사용하면 되는데 왜 쿠키를 사용할까? - 토큰(Token) 인증 - JWT(JSON Web Token)란? - JWT의 구조 - JWT를 이용한 인증 과정 - JWT 토큰 장단점 - Access Token과 Refresh Token - Refresh Token 활용하기 HTTP의 특징과 쿠키와 세션을 사용하는 이유 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있습니다. HTTP(Hypertext Transfer Protocol)는 인터넷 상에서 데이터를 주고 받기 위해 서버/클라이언트 모델을 따르는 통신 규약을 말합니다. 이 HTTP 프로토콜에는 비연결성(Connectionless)과 비상태성(Stateless)이라는 특징이 있습니다. 이는 서버의 자원을 절약하기 위해 모든 사용자의 요청마다 연결

Naver Blog

[Java]현재 날짜, 시간 구하기(Date, Calendar, SimpleDateFormat, LocalDate, LocalTime, LocalDateTime)

JAVA 현재 날짜, 시간 구하기 - SimpleDateFormat 클래스 - Date 클래스 - Calendar 클래스 - System 클래스의 currentTimeMillis() 이용 - LocalDate 클래스 - LocalTime 클래스 - LocalDateTime 클래스 - ZonedDateTime 클래스 SimpleDateFormat 클래스 SimpleDateFormat 클래스는 날짜-시간 형식에 대해서 사용자 정의 패턴을 정의하여 표현해주는 클래스입니다. · Date, Claendar 클래스를 이용시 해당 클래스를 함께 사용하여 원하는 형태로 출력합니다. import java.text.SimpleDateFormat; import java.util.Date; public class CurrentTime { public static void main(String[] args) { Date today = new Date(); // 포맷 지정 전: Wed Nov 16 19:15

1 2 3