본문 바로가기

전체 글

(33)
[MySQL]where절에서 list를 참조하는 방법 해시태그 기능을 구현하면서 매퍼를 작성하려고 했는데,insert문을 작동시키기 위해서는 기존 hashtag와의 대조가 필요하다.hashtag_name(해시태그명)은 unique key이기 때문에 DB에서 중복되면 안 되기 때문이다. 목표는 다음과 같다.SELECT hashtag_idx, hashtag_name, hashtag_time FROM hashtag WHERE hashtag_name IN ('지성피부', '모공케어', '20대남성') 그래서 일단 아래와 같이 작성을 해봤다. select id="selectOne" parameterType="int" resultType="hashtag"> select * from hashtag where hashtag_name in #{ hashtag_name } ..
스프링 MVC의 핵심: DispatcherServlet과 Controller는 어떻게 협력할까? 이전 포스트에서 스프링의 핵심 원리인 IoC/DI에 대해 알아보았습니다. 이제는 스프링 MVC 패턴의 심장부라 할 수 있는 DispatcherServlet과 @Controller가 어떻게 요청을 처리하고 응답을 만들어내는지 그 과정을 자세히 들여다보겠습니다.실제 코드를 통해 스프링이 어떻게 컨트롤러를 인식하고, 요청을 연결하며, 최종적으로 사용자에게 화면을 보여주는지 그 흐름을 단계별로 파헤쳐 봅니다.1. 스프링은 컨트롤러를 어떻게 찾아서 생성할까?클라이언트의 요청을 가장 먼저 처리하는 것은 컨트롤러 객체입니다. 그렇다면 스프링 컨테이너는 어떤 클래스가 컨트롤러인지 어떻게 알고 객체로 만들어 관리할까요? 정답은 어노테이션(@)과 컴포넌트 스캔(Component Scan)에 있습니다.1단계: 컨트롤러 자격..
스프링 DI 심화: List, Set, Map 컬렉션 주입 완전 정복 이전 포스트에서는 스프링의 핵심인 IoC/DI의 기본 개념과 간단한 객체를 주입하는 방법을 알아보았습니다. 하지만 실제 개발에서는 문자열이나 숫자뿐만 아니라, 여러 개의 데이터를 담는 컬렉션(Collection) 객체를 다루는 일이 훨씬 많습니다.스프링은 이러한 List, Set, Map과 같은 컬렉션 타입 객체들도 아주 우아하게 생성하고 주입할 수 있는 강력한 기능을 제공합니다. 이번 포스팅에서는 XML 설정을 통해 다양한 컬렉션들을 어떻게 주입하고 활용하는지 예제와 함께 자세히 살펴보겠습니다. 1. List 주입: 순서가 있는 데이터 묶음 만들기List는 순서가 보장되고 중복 값을 허용하는 가장 기본적인 컬렉션입니다. 스프링이 어떻게 ArrayList를 만들어 MyList 객체에 주입하는지 따라가 보..
스프링의 숨겨진 비밀: Console 로그로 배우는 Bean의 생명주기 이전 포스트에서 우리는 IoC와 DI의 기본 개념을 알아보았습니다. 이번에는 PersonVo의 생성자와 setName 메서드에 추가한 System.out.println 로그를 통해, 스프링 컨테이너가 내부적으로 어떻게 객체(Bean)들을 관리하는지 그 비밀을 파헤쳐 보겠습니다.이 과정을 이해하면 왜 어떤 객체는 서버 시작 시 단 한 번만 생성되고, 어떤 객체는 새로고침할 때마다 계속 생성되는지 명확하게 알 수 있습니다.1. 핵심 개념: Bean 스코프 (Singleton vs Prototype)이 현상을 이해하기 위한 가장 중요한 키워드는 바로 Bean 스코프(Scope)입니다. 스코프란, 스프링이 생성한 Bean이 존재할 수 있는 범위, 즉 생명주기를 의미합니다. 가장 대표적인 두 가지 스코프는 다음과..
스프링(Spring)의 핵심 철학: IoC와 DI, 왜 사용할까? "스프링을 사용하면 뭐가 좋은가요?"라는 질문에 많은 개발자가 'IoC와 DI'를 꼽습니다. 하지만 이 용어들은 처음 들으면 낯설고 어렵게 느껴지죠.이번 포스팅에서는 IoC와 DI가 무엇인지, 그리고 이 개념들이 왜 스프링을 강력하게 만드는지 명확한 '적용 전'과 '적용 후' 예제를 통해 알아보겠습니다. 1. 우리가 알던 방식: IoC/DI가 없던 시절 (Non-IoC)먼저 스프링의 도움 없이, 전통적인 방식으로 PersonVo 객체를 생성하고 사용하는 예제를 봅시다.파일: _01_non_ioc.jsp 이 코드는 간단하고 직관적입니다. 하지만 여기에는 중요한 문제가 숨어있습니다. _01_non_ioc.jsp라는 파일이 PersonVo 객체를 필요로 하는 동시에, 직접 new 키워드를 사용해 생성까지 책임..
MyBatis로 DB 연동하기: JDBC를 떠나보내야 하는 이유 Java 웹 개발에서 데이터베이스 연동은 필수적이지만, 전통적인 JDBC 방식은 번거로운 반복 작업이 많았습니다. Connection, PreparedStatement, ResultSet 객체를 일일이 생성하고, try-catch-finally로 자원을 해제하며, SQL 쿼리 결과를 Java 객체에 수동으로 담는 과정은 지루하고 실수하기도 쉬웠죠.이번 포스팅에서는 MyBatis라는 강력한 프레임워크를 도입하여 이 모든 과정을 얼마나 간결하고 우아하게 바꿀 수 있는지, 그리고 MyBatis의 꽃이라 불리는 **'동적 쿼리'**를 활용해 복잡한 조건 검색 기능을 얼마나 쉽게 구현할 수 있는지 단계별로 알아보겠습니다. ## 1. MyBatis 환경 설정하기: 첫 단추 끼우기 MyBatis를 사용하기 위한 초기..
웹 개발의 시작, 회원 관리 시스템 만들기 2 지난 Part 1에서는 회원 가입(Create)과 목록 조회(Read) 기능의 뼈대를 세웠습니다. 이번 파트에서는 드디어 사용자가 시스템을 이용할 수 있도록 하는 로그인/로그아웃 기능을 구현하고, 관리자가 회원을 관리하는 데 필수적인 정보 수정(Update) 및 삭제(Delete) 기능을 추가하여 회원 관리 시스템을 완성해 보겠습니다.1. 시스템의 문을 열다: 로그인 & 로그아웃 기능 사용자가 시스템에 자신의 신분을 증명하고 서비스를 이용하도록 하는 로그인 기능과, 안전하게 사용을 마치는 로그아웃 기능을 구현해 봅시다.1단계: 로그인 화면 (MemberLoginFormAction & member_login_form.jsp)사용자가 '로그인' 버튼을 누르면, MemberLoginFormAction 서블릿이..
웹 개발의 시작, 회원 관리 시스템 만들기 모든 웹 애플리케이션의 가장 기본적이면서도 핵심적인 기능은 바로 회원 관리입니다. 이번 시리즈에서는 Java 서블릿과 JSP, 그리고 Oracle 데이터베이스를 사용하여 사용자가 가입하고, 관리자가 회원 목록을 조회하는 기능부터 차근차근 구현해 보겠습니다.특히 이번 파트에서는 실시간 아이디 중복 체크, 주소 찾기 API 연동 등 사용자 편의성을 높이는 기술들도 함께 다뤄보겠습니다. 1. 모든 것의 기반: 데이터베이스와 VO 설계코드를 작성하기 전에, 회원 정보를 저장할 데이터베이스 테이블과 그 정보를 Java 객체로 다룰 설계도(VO)가 필요합니다.데이터베이스 테이블 (Oracle 기준)MemberVo 클래스를 기반으로 MEMBER 테이블을 설계할 수 있습니다. mem_idx는 각 회원을 식별하는 고유한..