전체 글 (86) 썸네일형 리스트형 Gradle과 Maven: 빌드 도구의 이해와 차이점 분석 1. 빌드 도구를 왜 사용할까?개발을 하다 보면, 단순히 코드를 작성하는 것만으로 끝나지 않는다.작성한 코드를 실행 가능한 프로그램으로 만들기 위해 여러 작업이 필요하다.예를 들면:소스 코드를 컴파일(코드를 기계어로 번역)테스트 코드 실행실행 파일이나 라이브러리로 패키징외부 라이브러리 의존성 다운로드이 모든 과정을 매번 수작업으로 한다면? → 번거롭고, 실수도 많고, 시간이 너무 오래 걸린다.그래서 등장한 것이 바로 빌드 도구(Build Tool).빌드 도구는 위 작업들을 자동화해주는 프로그램이다.덕분에 개발자는 코딩에만 집중할 수 있고, 빌드는 버튼 하나로 끝낼 수 있다.2. Gradle이란?Gradle은 요즘 가장 많이 쓰이는 빌드 도구 중 하나다.특징을 정리하면:스크립트 언어: 빌드 설정을 Groo.. Python에서 ModuleNotFoundError 발생 시 VS Code에서 확인해야 할 점 Python 프로젝트를 진행하다 보면, 외부 라이브러리를 설치했음에도 불구하고 ModuleNotFoundError가 발생하는 경우가 종종 있다. 예를 들어 다음과 같은 오류 메시지를 볼 수 있다.이 글에서는 위와 같은 오류가 발생하는 일반적인 원인과, VS Code 환경에서 확인하고 조치할 수 있는 방법을 정리한다. 특히 가상환경을 사용하지 않고 Python을 운영체제에 전역으로 설치해 사용하는 개발자를 위한 내용을 중심으로 설명한다. 1. ModuleNotFoundError란 무엇인가?ModuleNotFoundError는 Python에서 특정 모듈을 불러오려고 했으나 해당 모듈을 찾을 수 없을 때 발생하는 오류다. 이 오류가 발생하는 이유는 다음 중 하나다.해당 모듈이 설치되지 않았거나모듈이 설치되어는.. ROWNUM vs ROW_NUMBER() — 차이점 및 상세 비교 정리 1. 개념 비교: 두 함수의 근본적인 차이 항목 ROWNUM ROW_NUMBER() 순번 부여 시점SELECT 이후, ORDER BY 이전ORDER BY 이후에 윈도우 함수로 번호 부여정렬 반영 여부반영되지 않음원하는 정렬 기준 반영 가능고유성보장되지 않음고유하게 1부터 순번 부여페이징 용이성서브쿼리 필요직관적이고 쉬움사용 가능 DBOracle 한정SQL 표준을 지원하는 대부분의 DB 2. ROWNUM: 정렬 전 순번 부여의 한계잘못된 ROWNUM 사용 예SELECT employee_id, name, salaryFROM employeesWHERE ROWNUM 문제점: ROWNUM은 정렬 이전에 순번이 부여되므로, 원하는 정렬 기준이 반영되지 않은 채 임의의 3명이 추출됨 잘못된 결과 예시 (ROWNU.. Spring Boot와 기존 Spring의 차이점 Spring Framework는 Java 개발자들 사이에서 가장 인기 있는 오픈소스 애플리케이션 프레임워크 중 하나로, 다양한 구성 요소와 강력한 유연성을 제공합니다. 그러나 Spring을 사용하여 애플리케이션을 구축하려면 많은 설정 작업이 필요했으며, 이로 인해 개발자가 설정과 관련된 문제에 집중하기보다는 비즈니스 로직에 집중할 수 없다는 단점이 있었습니다. 이러한 문제를 해결하기 위해 등장한 것이 Spring Boot입니다.Spring Boot는 기존의 Spring Framework를 기반으로 하지만, 설정과 구성의 복잡성을 크게 줄이고, 개발자가 더 쉽게 애플리케이션을 개발할 수 있도록 돕는 도구입니다. 이 포스트에서는 Spring Boot와 기존 Spring의 차이점을 다뤄보겠습니다.1. 설정의 .. Spring @Transactional : 원리부터 실전 주의사항까지 Spring에서 @Transactional은 가장 많이 쓰이면서도 가장 자주 오용되는 기능 중 하나다.겉으로는 단순해 보이지만, 내부 동작을 잘 모르고 쓰면 트랜잭션이 아예 시작되지 않거나, 롤백되지 않거나, 데이터 불일치 문제가 생길 수 있다.이 글에서는 단순 개념이 아니라 실제로 개발하다가 부딪히는 문제들을 기준으로 @Transactional을 깊이 있게 정리해본다.1. @Transactional이 작동하는 원리핵심은 프록시와 AOPSpring에서 @Transactional은 프록시 기반 AOP를 사용해 트랜잭션을 관리한다.즉, 트랜잭션을 시작하거나 커밋/롤백하는 실제 코드는 프록시 객체에 의해 실행된다.기본 흐름은 다음과 같다:Bean 등록 시 Spring이 트랜잭션 어노테이션이 붙은 클래스를 프록.. Spring Bean 생명주기와 스코프 정리 Spring에서 Bean은 객체를 자동으로 생성하고 관리하는 단위다. 이 Bean이 생성되고 사용되며 종료되는 전 과정이 생명주기이고, Bean이 어떤 범위로 관리되는지가 스코프다.1. Bean 생명주기Bean은 아래와 같은 순서를 따라 생성되고 제거된다.생명주기 단계객체 생성Spring 컨테이너가 Bean 정의를 기반으로 객체를 생성한다.의존성 주입생성된 객체에 필요한 의존성이 주입된다.초기화 콜백@PostConstruct 또는 InitializingBean.afterPropertiesSet()을 통해 초기화 작업 수행.사용컨테이너가 Bean을 필요에 따라 사용한다.소멸 콜백@PreDestroy 또는 DisposableBean.destroy() 호출로 정리 작업 수행. 예제@Componentpubli.. GoF 디자인 패턴 - 브릿지 패턴 (Bridge Pattern) 1. 브릿지 패턴이란?브릿지 패턴은 구현(Implementation)과 추상화(Abstraction)를 분리하여 각자 독립적으로 확장할 수 있게 해주는 구조 패턴이다. 즉, 추상적인 기능과 그 기능의 실제 구현을 분리하여 변경이 유연하게 이루어질 수 있도록 한다.특징구현과 추상화의 분리: 서로 독립적으로 확장 가능유지보수 용이: 코드 변경 시 영향 범위가 작아진다클래스 수 감소: 기능 조합이 많아질 경우 클래스 폭증을 방지한다2. 브릿지 패턴의 구조Abstraction(추상화): 클라이언트가 사용하는 인터페이스를 정의하며, 구현체 객체에 위임RefinedAbstraction(확장된 추상화): Abstraction의 확장, 구체적인 기능 제공Implementor(구현 인터페이스): Abstraction에서.. GoF 디자인 패턴 - 어댑터 패턴 (Adapter Pattern) 1. 어댑터 패턴이란?어댑터 패턴은 구조 패턴 (Structural Patterns)의 하나로써 서로 호환되지 않는 인터페이스를 가진 클래스들을 함께 동작하도록 연결해주는 구조 패턴이다. 마치 전기 콘센트의 어댑터처럼, 기존 클래스의 인터페이스를 클라이언트가 기대하는 인터페이스로 변환하여 사용 가능하게 만든다. 특징인터페이스 호환 문제 해결: 기존 코드를 수정하지 않고도 새 코드와 호환되게 만든다.기존 시스템 재사용성 증가: 이미 존재하는 클래스를 변경 없이 재활용할 수 있다.SOLID 원칙 중 개방/폐쇄 원칙(OCP)과 단일 책임 원칙(SRP)을 지킴 2. 어댑터 패턴의 구조Target(목표 인터페이스): 클라이언트가 기대하는 인터페이스Adaptee(적응 대상 클래스): 기존에 호환되지 않는 인터페이.. 이전 1 2 3 4 ··· 11 다음