Programming/Spring 10

IoC 디자인 원칙과 스프링 프레임워크

IoC는 디자인 원칙이다.스프링 프레임워크는 IoC디자인 원칙을 따르고 있다. IoC 원칙을 구현하기 위해 스프링은 *IoC컨테이너를 제공하고 이 컨테이너의 핵심 인터페이스는 BeanFactory이다.*(IoC컨테이너는 실제 구현되어있는 클래스나 인터페이스가 아닌 개념에 가깝다. IoC컨테이너를 제공한다는것은 IoC컨테이너라는 개념을 구현한 실제 인터페이스와 구현체를 제공한다는 것이다.)스프링에서 제공하는 대표적인 IoC 컨테이너에는 BeanFactory라는 인터페이스가 있다. IoC 원칙을 적용해서 객체 생성, 의존성 주입, 빈 생명주기 관리 등을 수행한다. 가장 기본적인 스프링 IoC컨테이너이자, 경량 컨테이너이다. 이 인터페이스의 대표적인 구현체로는 DefaultListableBeanFactory가..

Programming/Spring 2025.01.11

동시성 제어란

동시성 제어란 여러 작업(요청, 쓰레드, 사용자 등)이 동시에 동일한 자원(데이터, 파일 등)을 사용할 때 발생할 수 있는 문제를 예방하고 올바르게 처리하는 방법 문제 상황 예시1. 친구와 같이 피자를 먹음2. 동시에 마지막 조각 먹는다 선언 후 둘다 라스트 피스에 접근3. 누가 먹었는지 헷갈림--> 동시성 제어는 이런 혼란을 방지하는 규칙을 세우는 것.  Mysql을 이용한 동시성 이슈 해결방법PessimisticLockOptimisticLockNamedLock Redis를 이용한 동시성 이슈 해결방법LettuceLockRedissonLock 동시성 제어란 여러 작업이 같은 데이터를 동시에 처리하려고 할 때, 데이터 충돌이나 혼란을 방지하는 기술

Programming/Spring 2025.01.02

이메일 인증 구현하기

이메일 인증을 구현해보자. 이메일 인증을 구현하기 위한 단계는 다음과 같다.1. 사용자가 이메일을 입력 -> 인증버튼을 클릭 -> 서버에서 인증코드 생성 & 이메일 발송 & Redis 저장2. 사용자가 인증코드 입력 -> 서버로 전송 -> Redis에 저장된 코드와 비교 -> 일치하면 "이메일 인증 완료" 처리3. 그 후 회원가입 완료 API 호출 1. Redis 연동 설정1-1 build.gradleimplementation 'org.springframework.boot:spring-boot-starter-data-redis'1-2. application.ymlspring: redis: host: 127.0.0.1 port: 6379 password: "" # 비밀번호가 있다면 ..

Programming/Spring 2024.12.31

EntityFinder에 대한 고찰

엔티티를 가져오기위해 ID를 조회하는 로직이 많고 반복됨. EntityFinder라는 클래스를 만들어서 공통 기능을 분리하여 중복을 제거하기로함.사용하다보니 이 헬퍼클래스만으로 다양한 곳에서 사용될 경우 변경 전파의 위험성을 인지하게 됨. 또한 데이터 존재 여부와 조회의 역할을 서비스에서 해주는게 맞는가라는 생각이 듬. 고민을 하다 BaseRepository를 만들어서 모든 레포지토리가 BaseRepository의 인터페이스를 상속하여 변경 전파의 리스크도 줄이고 책임을 분리시키기로함.import org.springframework.data.jpa.repository.JpaRepository;import java.util.Optional;public interface BaseRepository exten..

Programming/Spring 2024.12.24

ResponseDTO의 목적

ResponseDTO(Data Transfer Object)를 사용하는 주된 목적 중 하나는 백엔드와 프론트엔드 간의 명확하고 효율적인 데이터 전달을 보장하는 것입니다. 이를 통해 양측 간의 협업이 원활해지며, 여러 가지 이점이 있습니다. 좀 더 구체적으로 설명드리자면:1. 명확한 계약 정의ResponseDTO는 백엔드와 프론트엔드 간의 데이터 계약을 명확히 정의합니다. 이는 양쪽 개발자가 어떤 데이터를 주고받는지 명확히 이해할 수 있게 하며, 변경 시 영향 범위를 쉽게 파악할 수 있게 도와줍니다.2. 데이터 보안 및 캡슐화직접적으로 엔티티(Entity)나 도메인 모델을 클라이언트에 노출시키는 것은 보안상 위험할 수 있습니다. ResponseDTO를 사용하면 클라이언트에 필요한 정보만 선택적으로 노출할 ..

Programming/Spring 2024.12.07

빈(Bean)이 뭔데?

스프링을 공부하고 프로젝트를 하다보면 Bean이라는 단어가 많이 나오는데 정확히 뭔지 궁금해짐. Bean은 한마디로 정의하면 스프링 컨테이너가 관리하는 객체임. Q. 그냥 객체랑 스프링 컨테이너가 관리하는 객체는 다른건가?A. 그렇다. 그냥 객체는MyComponent myComponent = new MyComponent(); 와 같이 개발자가 new 키워드를 사용해 직접 생성하는거임.객체의 생성, 소멸, 의존성 주입 등을 개발자가 수동으로 처리함. 반면에 스프링 컨테이너가 관리하는 객체(Bean)는 스프링이 객체의 생성, 초기화, 의존성 주입, 소멸을 모두 자동으로 처리함. Q. 스프링 컨테이너는 뭔가? 그리고 빈은 어떻게 등록하는가? A. 스프링 컨테이너는 간단히 말해 빈을 관리하는 관리자임. 주요 기..

Programming/Spring 2024.11.22

어노테이션 정리

@Controller역할: 클라이언트의 요청을 받아 **뷰(HTML 페이지)**를 반환하는 역할.예: 로그인 폼이나 회원 가입 페이지를 보여줄 때.@RestController역할: 클라이언트의 요청에 대해 JSON, XML 데이터를 바로 응답하는 역할.예: REST API를 만들 때 사용.@RequestMapping역할: 요청 URL을 특정 메서드와 연결하는 역할.예: "/users" 요청이 오면 해당 메서드를 실행.@RequestParam역할: 요청 URL이나 폼에서 전달된 파라미터 값을 메서드 변수에 바인딩.예: ?id=123 요청에서 id 값을 메서드에 전달.@ModelAttribute역할: 폼 데이터를 객체로 바인딩하거나, 뷰에 기본 데이터를 전달.예: 사용자 입력 데이터를 User 객체로 변환...

Programming/Spring 2024.11.22

서블릿과 JSP

@WebServlet: Controller + RequestMapping 서블릿 생명주기 맵핑이란?매핑(mapping)은 클라이언트가 요청한 URL을 기반으로 해당 요청을 처리할 수 있는 코드나 로직(핸들러)을 연결하는 과정을 말한다. 웹 애플리케이션에서 매핑은 클라이언트 요청이 들어왔을 때, 그 요청에 해당하는 결과를 제공하기 위해 적절한 컨트롤러 메서드나 서블릿을 찾아 실행하는 역할을 한다. 네가지 저장소page conextapplicationsession (편리하지만 메모리부담이 제일큼)request 객체 (제일 부담 적음)    HTTP는 무상태임 독립성과 확장성을 위해서 상태정보를 저장하지 않음.저장하려면 쿠키, 세션 등이 필요한데 세션은 클라이언트마다 한개씩 있는 개별저장소임.

Programming/Spring 2024.11.21

HTTP 요청과 응답

HttpServletRequest 메서드 참고 Ctrl + Shift + O: 자동 import HttpServletRequest클라이언트가 서버에 요청을 보낼 때, 요청에 관한 정보를 담고 있다주요 역할:요청 데이터 가져오기클라이언트가 보낸 데이터(쿼리 파라미터, 폼 데이터 등)를 읽을 수 있다.request.getParameter("name") → URL이나 폼에서 전달된 name 값을 가져옴.요청 메타데이터 확인어떤 HTTP 메서드인지(GET, POST, 등) 확인 가능 → request.getMethod()요청 URL, 헤더 정보, 세션 정보 등도 조회 가능 → request.getHeader("User-Agent")String name = request.getParameter("name"); /..

Programming/Spring 2024.11.21

원격 프로그램 실행

@Controller: 원격 호출 가능한 프로그램으로 등록@RequestMapping: URL과 메서드를 연결 왜 static이 아닌데 호출이 가능할까?public void main은 인스턴스 메서드인데 인스턴스 메서드는 객체생성 후 호출이 가능하다. 톰캣이 객체로 생성 해준다. Reflection API의 중요성https://velog.io/@alsgus92/Java-Reflection%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%96%B8%EC%A0%9C%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B4-%EC%A2%8B%EC%9D%84%EA%B9%8C  스프..

Programming/Spring 2024.11.20