73건의 항목

  • 2025년 3월 31일

    DefaultHandshakeHandler 정의 WebSocket 연결 시 Principal을 설정하여 사용자를 구분할 수 있는 핸들러입니다. WebSocket 세션과 사용자를 매핑하는 데 유용하며, SimpMessagingTemplate을 사용하여 특정 사용자에게 메시지를 보낼 때 활용됩니다.

  • 2025년 3월 31일

    WebSocket 기반의 STOMP 메시징에서는 사용자 구분 및 특정 사용자에게 메시지를 전송하는 기능이 필요할 수 있습니다. WebSocket에선 사용자가 WebSocket에 연결될 때 Principal 객체를 사용하여 구분할 수 있고, 특정 사용자의 세션 ID를 가져와서 메시지를 개별적으로 보낼 수 있습니다.

  • 2025년 3월 31일

    WebSocketMessageBrokerConfigurer 정의 WebSocketMessageBrokerConfigurer는 Spring에서 STOMP 기반의 WebSocket 메시지 브로커를 설정할 때 사용하는 인터페이스입니다. 메시지 브로커 기반으로 설정하는 클래스이며, 단순 WebSocket 설정을 위해서는 WebSocketConfigurer로 설정을 해 줘야 합니다.

  • 2025년 3월 31일

    STOMP 정의 STOMP(Simple Text Oriented Messaging Protocol)는 텍스트 기반의 메시징 프로토콜로, WebSocket 위에서 동작하는 Pub/Sub(발행/구독) 모델을 지원하는 프로토콜입니다.WebSocket이 양방향 통신을 위한 저수준 프로토콜이라면, STOMP는 메시지 브로커를 ...

  • 2025년 3월 31일

    기본적인 WebSocket은 클라이언트와 서버 간의 양방향 통신을 가능하게 하지만, 메시지를 어떻게 구성하고 처리할지에 대한 표준이 없습니다. 이를 해결하기 위해 WebSocket 위에서 동작하는 STOMP을 사용하면, 일정한 규격을 갖춘 메시지를 주고받을 수 있으며, 메시지 브로커를 활용한 Pub/Sub 구조를 쉽게 구현할 수 있습니다.

  • 2025년 3월 31일

    WebSocketConfigurer 정의 WebSocketConfigurer는 Spring에서 WebSocket 핸들러를 등록하는 인터페이스이를 구현하면 WebSocket 엔드포인트를 설정하고, 특정 핸들러와 매핑할 수 있습니다. 단순 WebSocket이 필요한 상태일 때 사용하는 설정 클래스이며, 메시지 브로커 기반으로 설정을 위해서는 WebSocketMessageBrokerConfigurer로 설정을 해 줘야 합니다.

  • 2025년 3월 31일

    WebSocketHandler 정의 Spring에서 제공하는 WebSocket을 처리하기 위한 WebSocketHandler 인터페이스이를 구현하는 방식에 따라 TextWebSocketHandler와 BinaryWebSocketHandler 등으로 나뉩니다. WebSocketHandler 종류 핸들러 종류사용 목적지원 메시지 유형WebSocketHandler기본 WebSocket 인터페이스텍스트 + 바이너리TextWebSocketHandler텍스트 메시지 전용 (채팅, JSON)TextMessageBinaryWebSocketHandler파일, 이미지, 오디오 등 바이너리 전용BinaryMessagePerConnectionWebSocketHandler세션별 독립적인 핸들러 생성텍스트 + 바이너리 주요 메서드 메서드설명afterConnectionEstablished클라이언트가 연결되었을 때 호출handleMessage클라이언트가 메시지를 보냈을 때 호출handleTransportErrorWebSocket 통신 중 오류 발생 시 호출afterConnectionClosed클라이언트가 연결을 종료했을 때 호출supportsPartialMessages부분 메시지(프레임 분할)를 지원하는지 여부 구현 예시 간단히 TextWebSocketHandler를 구현한 예시입니다.

  • 2025년 3월 30일

    기본적인 WebSocket 기능을 사용하여 양방향 통신이 가능하도록 구현합니다. 필요 라이브러리 // build.gradle .. dependencies { .. implementation 'org.springframework.boot:spring-boot-starter-websocket' } ..

  • 2025년 3월 16일

    트랜잭션 전파(Transaction Propagation) 정의 트랜잭션이 하나 시작한 상태에서 또 다른 트랜잭션을 시작하면 새 트랜잭션을 생성할지, 기존 트랜잭션에 참여할지 등등을 결정하는 방식 Spring에서는 기본적으로 기존 트랜잭션에 참여하는 방식이 기본값이고, 원할 시 다른 방식으로 변경이 가능합니다 ...

  • 2025년 3월 15일

    AOP(Aspect-Oriented Programming)의 정의 관점 지향 프로그래밍(AOP) 을 이용하여 트랜잭션 관리를 자동화하는 기법Spring에서는 @Transactional을 사용하면 프록시가 생성되며 AOP가 자동으로 적용됩니다. 프록시란? 자동으로 만들어져서 원래 객체 대신해서 요청을 받고, 로직을 수행하는 중간 역할의 객체입니다.

  • 2025년 3월 12일

    Querydsl의 정의 Java 코드 기반으로 SQL, JPA, MongoDB 등의 쿼리를 생성할 수 있도록 해주는 라이브러리JPA와 함께 사용할 경우, 컴파일 타임에 검증 가능한 코드로 복잡한 동적 쿼리를 간결하게 작성할 수 있습니다. Q클래스 Querydsl이 엔티티를 대상으로 자동 생성하는 클래스해당 클래스를 통해 Java 코드 기반으로 쿼리를 작성할 수 있게 됩니다.

  • 2025년 3월 10일

    JPA의 정의 JPA(Java Persistence API)는 자바 객체를 관계형 데이터베이스와 매핑(ORM, Object-Relational Mapping)하기 위한 표준 API즉, DB의 데이터들을 객체 다루듯이 다룰 수 있도록 해줍니다. ORM 매핑 프로젝트의 객체와 이 객체에 해당하는 DB의 테이블을 매핑할 수 있습니다.

  • 2025년 3월 09일

    MyBatis의 정의 JdbcTemplate이 제공하는 기능을 제공하면서 추가로 동적 쿼리를 편리하게 작성할 수 있게 하는 SQL Mapper XML을 통해 SQL 쿼리를 작성하고 기능에 매핑할 수 있습니다. 적용 방법 findAll()에서 검색 기능이 있고, 검색 조건을 넣기 위한 MemberSearchCond가 있는 상황이라고 생각해보겠습니다.

  • 2025년 3월 08일

    데이터 격리 처리가 필요한 이유 각 테스트별로 데이터가 추가가 되면, 이는 다른 테스트에 영향을 줄 수 있고, 또 테스트를 중복 실행할 때 이전에 성공했던 테스트가 다음엔 실패하게 될 수 있습니다. 테스트의 일관성을 유지하고, 다른 테스트에 간섭을 하지 않기 위해서 테스트를 위해 생성했던 데이터는 테스트가 끝나면 모두 지워줘야 합니다.

  • 2025년 3월 08일

    직접 연결 test 폴더 하위의 resources/application.properties에도 spring.datasource.~ 설정을 추가해 줍니다. # properties spring.profiles.active = test spring.datasource.url = jdbc:h2:tcp://localhost/~/test spring.datasource.username = sa spring.datasource.password = 임베디드 DB 연결 1.

  • 2025년 3월 07일

    JdbcTemplate의 정의 템플릿 콜백 패턴을 사용하여 JDBC를 직접 사용할 때 발생하는 반복 작업을 대신 처리해주는 유틸리티 JDBC 단순 사용과의 비교 [Before] @RequiredArgsConstructor public class BeforeRepository { private final DataSource ...

  • 2025년 3월 06일

    SQLExceptionTranslator의 정의 Spring에서 체크 예외인 SQLException을 적절한 DataAccessException 계열의 예외로 변환하는 인터페이스 사용법 translate() 사용 DataAccessException translate(String task, @Nullable ...

  • 2025년 3월 06일

    DataAccessException의 정의 데이터 접근 중 발생하는 예외를 처리하기 위해 Spring에서 제공하는 런타임 예외 체크 예외로 선언될 경우 매번 throws로 전파해야 하는 문제를 방지하고, 일관된 예외 처리를 가능하게 합니다. 계층 DataAccessException 하위로 SQL 문법 오류, 타임아웃 오류 등 여러 데이터 접근 상황에서 발생하는 에러들이 구현되어 있습니다.

  • 2025년 3월 03일

    @Transactional의 정의 트랜잭션을 시작하고 커밋, 롤백 후 트랜잭션을 종료하는 과정을 서비스 로직에서 분리하기 위해 트랜잭션 프록시를 만드는 과정을 처리해주는 어노테이션 사용 예시 1. 클래스에서 사용 @Transactional public class Service() { public void save() { } public void delete() { } } 정리 클래스에서 @Transactional 사용 시 하위의 모든 메서드인 save(), delete()에 트랜잭션이 적용됩니다.

  • 2025년 3월 03일

    TransactionTemplate의 정의 템플릿 콜백 패턴을 적용하여 Transaction 과정에서 반복적으로 작업하는 트랜잭션 만들기 -> 오류 없으면 commit하기 -> 오류 있으면 rollback하기과정을 간단하게 진행하게 해 주는 클래스입니다. 기능 public class TransactionTemplate { private PlatformTransactionManager transactionManager; public <T> T execute(TransactionCallback<T> action){..} void executeWithoutResult(Consumer<TransactionStatus> action){..} } execute() : 응답 값이 있을 때 사용합니다.

  • 2025년 3월 03일

    PlatformTransactionManager의 정의 트랜잭션을 시작하고 커밋, 롤백하는 과정을 JDBC와 같은 특정 데이터 접근 기술에 종속되지 않게 하기 위해 추상화하여 만든 인터페이스 구조 기능 [인터페이스 전체 구조] package org.springframework.transaction; public interface ...

  • 2025년 3월 03일

    Transaction 단순 처리 시 문제점 Transaction을 단순 처리한 Service를 확인하면 서비스 로직 뿐만이 아닌 과정이 많이 포함이 되어버리는 것을 확인할 수 있습니다. 이처럼 단순하게 커넥션에서 Transaction을 만들어 커밋 or 롤백 처리를 하게되면 여러 문제점이 나타나게 됩니다.

  • 2025년 3월 02일

    Transaction의 정의 데이터베이스에서 상태를 변화시키기 위해 수행하는 작업의 단위 ex) A가 B에게 5000원을 송금하는 경우 → A의 잔고에서 5000원을 감소시키고, B의 잔고에서 5000원을 증가시키는 작업이 하나의 Transaction이 됩니다. Transaction이 안지켜져 문제가 되는 경우 A가 B에게 5000원 송금을 하는데, 오타로 인해 아래와 같이 실행되면 문제가 생깁니다.

  • 2025년 2월 28일

    커넥션 풀의 필요성 데이터베이스에 한번 Connection을 만들 때 마다 아래와 같은 복잡한 과정을 거칩니다. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다.

  • 2025년 2월 28일

    DataSource의 필요성 커넥션을 획득하는 방법은 DriverManager, Connection Pool 등 다양하게 있습니다. DriverManager를 통해 커넥션을 획득하도록 로직을 구성하다가, 커넥션 풀을 사용하는 방법으로 변경하면 로직의 코드를 변경해야 합니다.

  • 2025년 2월 28일

    JDBC 정의 Java에서 데이터베이스와 연동을 위해서 먼저 커넥션 연결을 확인하고 SQL을 전달해 DB로부터 결과를 응답받습니다.그러나 데이터베이스의 종류(ex) MySQL, Oracle)에 따라 커넥션 연결, SQL, 결과 응답에 대한 방법이 다르기 때문에 데이터베이스별로 코드를 각각 작성하는 대신, 자바에서 데이터베이스에 접속할 ...

  • 2025년 2월 14일

    Multipart의 정의 Http요청에서 파일 업로드를 할 때 주로 사용되며, 요청 데이터에 있는 파일이 Multipart 형태로 들어오게 됩니다. Multipart의 종류 Content-Type설명multipart/form-data파일 업로드 시 사용 (HTML 폼에서 <input type=“file”>을 사용할 때)multipart/mixed서로 다른 데이터 타입을 포함할 때 사용multipart/alternative동일한 내용을 여러 형식(예: HTML, Plain Text)으로 보낼 때 사용multipart/related본문과 연관된 데이터를 함께 보낼 때 (예: HTML 본문과 이미지 첨부) multipart/form-data 예시 POST /upload HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundary ------WebKitFormBoundary Content-Disposition: form-data; name="username" john_doe ------WebKitFormBoundary Content-Disposition: form-data; name="file"; filename="image.jpg" Content-Type: image/jpeg (binary data) ------WebKitFormBoundary-- Spring에서 Multipart관련 설정 1.

  • 2025년 2월 13일

    Formatter의 정의 실제 개발 환경에서는 문자열을 다른 타입으로 변환하거나, 다른 타입을 문자열로 변환하는 상황이 빈번할 것입니다. 이 때문에 객체를 특정한 포맷에 맞추어 문자로 출력하거나 또는 그 반대의 역할을 하는 것에 특화된 기능을 가진 Formatter가 생겼습니다.

  • 2025년 2월 13일

    Converter의 정의 Spring에서 변환해야 할 타입에 대한 정의를 미리 구현해놓은 것 이를 호출하여 자주 변환하는 타입에 대해 간편하게 타입 변환을 할 수 있습니다. Converter 생성 예시로 ip와 port 정보를 입력받으면 127.0.0.1:8080과 같은 형태로 타입을 변환하거나 그 반대로 변환하는 Converter를 만들어보겠습니다.

  • 2024년 9월 18일

    Spring에선 기본적으로 에러가 발생했을 때 가로채서 내가 원하는대로 처리해줄 수 있도록 하는 ExceptionResolver를 지원합니다. Spring이 기본적으로 지원하는 ExceptionResolver는 3종류가 있으며, 그 중 ResponseStatusExceptionResolver는 아래 두가지의 경우를 자동으로 처리할 수 있습니다.

  • 2024년 9월 16일

    예외 발생 방법 우선 예외를 발생시키는 방법에 대해 알아야 예외 처리를 할 수 있습니다. Exception 클래스 선언 throw new RuntimeException("예외 발생!"); Exception 클래스들을 새로 선언하여 에러를 발생시킬 수 있습니다.

  • 2024년 9월 14일

    Interceptor의 정의 Interceptor란 Spring MVC가 제공하는 기술입니다. Filter와 역할은 같지만 적용되는 순서와 범위, 사용방법이 다릅니다. Filter와의 차이점 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 스프링이 실행되는 흐름을 보면 필터는 서블릿 전에, 인터셉터는 서블릿 후에 호출됩니다.

  • 2024년 9월 14일

    Filter의 정의 Servlet이 지원하는 기능으로, 공통적인 관심사를 가지고 있는 기능들이 실행되기 전 공통적으로 수행할 작업을 진행할 수 있음. Filter의 인터페이스 형태 public interface Filter { public default void init(FilterConfig filterConfig) throws ServletException {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; public default void destroy() {} } init(): 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출됩니다.

  • 2024년 8월 29일

    @SessionAttribute의 정의 Spring에서 Session의 데이터를 더 간편하게 가져올 수 있도록 하는 기능입니다. 이 기능을 사용하면 세션을 따로 생성하진 않고 값을 가져오기만 합니다. 사용 예시 public String home( @SessionAttribute(name = "loginMember", required = false) Member loginMember, ...) { ..

  • 2024년 8월 29일

    세션이란? 로그인을 예시로 들면 사용자의 ID값 자체를 쿠키에 저장해버리면 보안이 취약해집니다. 이를 보완하기 위해 브라우저쪽에서 저장되어있는 쿠키 저장소와는 비슷하지만 다르게 서버쪽에서 저장되는 Key-Value타입의 저장공간을 세션(Session) 이라고 부릅니다. 사용자의 ID값은 세션 저장소의 value로 저장이 되고, 이에 대해 랜덤하게 생성된 Session ID값을 쿠키 저장소에서 저장되게 함으로써 쿠키 저장소에는 사용자에 대한 직접적인 정보를 저장하지 않도록 하였습니다.

  • 2024년 8월 21일

    정의 서블릿은 웹 컴포넌트 중 하나로, 웹 서버 또는 애플리케이션 서버에서 클라이언트의 요청을 처리하고 그 결과를 클라이언트에게 다시 전송하는 역할을 합니다. 서블릿 생성 예시 HttpServlet 클래스를 extends하여 service()함수를 구현해 사용할 수 있습니다.

  • 2024년 8월 21일

    Spring의 Model-View-Controller(MVC) 전체 구조 동작 순서 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다. 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다. 핸들러 어댑터 실행: 핸들러 어댑터를 실행한다.

  • 2024년 8월 21일

    Spring의 Message관리 정의 Spring 프로젝트에서 여러 곳에 사용되는 다양한 문구를 한 곳에서 관리할 수 있도록 하는 기능국가별로 설정할 수도 있어서 국제화 기능을 제공합니다. 초기 설정 Spring에선 ResourceBundleMessageSource를 Bean으로 등록해주면 됩니다.

  • 2024년 8월 21일

    HttpServletResponse의 정의 Servlet에서 HTTP 서버가 클라이언트에게 응답을 보내는 데 사용되는 객체 HTTP 응답 상태 코드를 설정하고, 응답 헤더를 추가하거나 수정하며, 클라이언트로 보낼 데이터를 쓸 수 있습니다. HTTP 응답 설정 1. 상태 코드 설정 response.setStatus(HttpServletResponse.SC_OK); // 정상 상태코드(200)을 설정 2.

  • 2024년 8월 21일

    HttpServletRequest의 정의 Servlet은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱하고, 그 결과를 HttpServletRequest 객체에 담아서 제공합니다. HTTP 요청 메시지 조회 http://localhost:8080/hello?username=hello에 접속한 상황 1.

  • 2024년 8월 21일

    BindingResult의 정의 사용자 입력의 데이터 바인딩 과정에서 발생하는 오류를 관리하고 추적하는 인터페이스 이를 통해 입력 데이터의 유효성 검사 결과를 저장하고, 필요할 때 오류를 쉽게 처리할 수 있도록 도와줍니다. 주의사항 Controller의 함수의 매개변수로 들어가는 BindingResult는 @ModelAttribute이 붙은 매개변수 바로 뒤에 와야 합니다.

  • 2024년 8월 21일

    Bean Validation의 정의 Bean Validation 2.0(JSR-380)이라는 기술 표준으로 검증 애노테이션과 여러 인터페이스의 모음입니다. 사전 작업 의존관계 추가 Bean Validation을 사용하기 위해선 우선 build.gradle에서 의존관계를 추가해줘야합니다.

  • 2024년 8월 21일

    Bean의 정의 Spring IoC(Inversion of Control) 컨테이너가 관리하는 객체입니다.의존성 주입(DI)을 통해 외부에서 관리 및 주입이 가능합니다. 선언 방법 1. XML을 통한 선언 <beans> <bean id="myBean" class="com.example.MyClass"/> </beans> 2.

  • 2024년 8월 21일

    ApplicationContext의 정의 Spring Bean을 관리하고 조회하는 Spring Container의 최상위 인터페이스인 BeanFactory라는 인터페이스의 기능을 모두 상속받아서 제공하는 역할을 합니다.거기다가 추가적으로 편리한 부가기능을 더 제공합니다 ...

  • 2024년 8월 21일

    검증 기능의 정의 클라이언트로부터 받은 데이터가 비즈니스 규칙을 만족하는지 확인하거나, 데이터가 일관성 있고 안정적인 상태를 유지할 수 있도록 보장해주는 기능 오류 관리와 추적 1. BindingResult ThymeLeaf에서 검증 오류 표현 ThymeLeaf의 검증 관련 기능 참고 (관련 글 준비 중) Message 기능 응용 Message 기능을 사용하여 오류 메시지를 효과적으로 관리할 수 있습니다.

  • 2024년 8월 20일

    @ResponseBody의 정의 Controller의 메서드가 return하는 데이터 자체가 클라이언트에게 전달되도록 하는 Annotation 단순 텍스트 응답 @ResponseBody @GetMapping("/response-body-string") public String responseBody() ...

  • 2024년 8월 20일

    @Validated의 정의 검증기를 실행하라는 AnnotationWebDataBinder 에 등록한 검증기를 찾아서 실행합니다. 검증기 선정 방법 여러 검증기 중 어떤 검증기를 적용하게 될 지는 supports()에서 지정한 클래스를 통해 정해집니다. 사용 예시 검증기(변동 없음) @Component public class ItemValidator implements Validator { @Override public boolean supports(Class<?> clazz) { return Item.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { ..

  • 2024년 8월 20일

    @RequestParam의 정의 클라이언트가 보낸 요청 중 파라미터의 값을 불러오고 싶을 때 사용하는 Annotation 기본 사용법 http://localhost:8080/request-param?username=hello&age=20 경로로 요청했을 때 @ResponseBody @RequestMapping("/request-param") ...

  • 2024년 8월 20일

    @RequestMapping의 정의 Spring에서 주로 사용하는 애노테이션 기반의 컨트롤러를 지원하는 핸들러 매핑과 어댑터 사용 예시 @Controller public class Controller { @RequestMapping("/hello/form", method = RequestMethod.GET) ...

  • 2024년 8월 20일

    @RequestBody의 정의 HTTP 요청의 Body를 자바 객체로 변환하여 그 메소드의 파라미터로 전달하도록 합니다.즉, 클라이언트로부터 받은 요청 본문을 자동으로 원하는 타입의 객체로 매핑해주는 역할 JSON과 같은 형태의 객체 생성 @Data public class HelloData { private String username; ...

  • 2024년 8월 20일

    @Qualifier의 정의 조회하고 싶은 Bean과 타입이 동일한 다른 Bean 이 한 개 이상 있다면 오류가 납니다.이럴 때 원하는 빈에게 조회할 때 사용할 별명을 @Qualifier로 지정해줄 수 있습니다. 사용 예시 빈 등록 @Component @Qualifier("mainDiscountPolicy") // public class RateDiscountPolicy implements DiscountPolicy { } 의존성 주입 @Autowired public OrderServiceImpl( MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy ) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } 코드 설명 빈 등록할 때 해당 빈에 @Qualifier를 통해 별명을 지어주고, 의존성을 주입할 때 @Qualifier를 이용하여 지어놓은 별명을 넣어 의존성 주입을 합니다.

  • 2024년 8월 20일

    @Primary의 정의 조회하고 싶은 Bean과 타입이 동일한 다른 Bean 이 한 개 이상 있다면 오류가 납니다.이럴 때 우선적으로 조회할 빈을 @Primary를 통해 지정해줄 수 있습니다. 사용 예시 빈 등록 @Component @Primary public class RateDiscountPolicy implements DiscountPolicy { } 의존성 주입 @Autowired public OrderServiceImpl( MemberRepository memberRepository, DiscountPolicy discountPolicy ) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } 코드 설명 빈 등록할 때 우선적으로 선언할 빈에게 @Primary 어노테이션을 추가해주면 별 다른 작업 없이 해당 타입의 빈을 의존성 주입하면 @Primary를 적용한 RateDiscoutPolicy타입의 빈이 주입됩니다.

  • 2024년 8월 20일

    @ModelAttribute의 정의 @RequestParam으로 프로퍼티 값을 하나 하나 받아오기 쉽지 않은 상황이 많습니다.이럴 때 파라미터들의 값을 프로퍼티 접근법(setXXX)으로 알아서 입력하여 객체로 값들을 받을 수 있게 해줍니다. 데이터가 들어갈 객체 생성 @Data public class HelloData { private String username; private int age; } 기본 사용법 @ResponseBody @RequestMapping("/model-attribute-v1") public String modelAttributeV1(@ModelAttribute HelloData helloData) { log.info("username={}, age={}", helloData.getUsername(), helloData.getAge()); return "ok"; }.

  • 2024년 8월 20일

    @ComponentScan의 정의 직접 xml이나 java코드로 설정파일을 작성할 필요 없이 @Component 어노테이션이 붙은 클래스들을 스프링 빈으로 등록해주는 Annotation @Autowired를 이용하여 설정했던 의존관계도 그대로 적용된 채로 Bean에 등록됩니다 ...

  • 2024년 8월 20일

    @Configuration의 정의 따로 빈 정의용 클래스를 하나 생성해서 빈을 정의하고 의존성을 설정하는 방식 이 어노테이션이 붙은 클래스 내에서 @Bean 어노테이션이 붙은 메서드를 통해 Bean을 정의하고, 컨테이너에 등록할 수 있습니다. 사용 예시 @Configuration public class AppConfig { @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } } 코드 설명 memberRepository, discoutPolicy, memberService, orderService 총 4개의 Bean이 생성됩니다.

  • 2024년 8월 20일

    @Autowired의 정의 Annotation을 통해 Bean으로 지정된 클래스들의 의존성 주입(DI)을 위해 사용하는 Annotation 사용 예시 1. 생성자 주입 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } } 코드 설명 OrderServiceImpl생성자에 @Autowired를 추가하여 OrderServiceImpl이 생성되면서 동시에 memberRepository와 discountPolicy의 의존성을 주입받음 2.

  • 2024년 3월 14일

    안녕하세요! 스프링 빈을 만들고 모든 빈이 행복하게 오래오래 살았으면 좋겠지만! 그렇지 않아야 유용할 때도 오겠죠? 그럴 땐 Scope라는 기능을 이용해 봅시다! 땅~ 👉이전 글 보러가기 스코프(Scope) 알아보기 (난 스나이퍼 위에 조준경 그거인줄…) 스코프는 번역하면 범위라고 합니다 ...

  • 2024년 3월 12일

    안녕하세요! 여러분. 스프링 빈이 언제 죽는다고 생각하십니까? 심장 깊숙이 총알이 박혔을 때? 불치의 병에 걸렸을 때? 독버섯으로 만든 스프를 마셨을 때? 바로… 지금 알아보러 갑시다! 👉이전 글 보러가기 상황 가정 우선 저희의 shopping 프로젝트에서보단 따로 상황을 가정해서 만들어봅시다.

  • 2024년 3월 12일

    안녕하세요! 지난 시간에 @Autowired라는 어노테이션을 통해 의존관계를 주입해 봤는데요! 하다 보면서 드는 생각은 어차피 의존관계 주입할 필드는 다 final을 쓸 거고, 다 생성자 만들어서 @Autowired 해줄 건데 엄청 반복적이면서 코드 길이만 늘리는 작업인 것 같아요 ...

  • 2024년 3월 07일

    안녕하세요!! 이전 글에서부터 저희는 Configuration 클래스가 자동으로 구성되도록 하고 있습니다. Component Scan을 통해서도 우선 어느 정도 구성이 되었지만 추가적으로 의존관계에 대해선 적용한 것이 없기 때문에 요건 Autowired라는 기능을 써서 자동으로 구성되게 만들어볼까 합니다.

  • 2024년 3월 06일

    안녕하세요! 열심히 스프링 Bean들의 설정을 구성하느라 고생 많으셨죠? 오늘은 조금 더 간편한 방법을 배워보려 합니다. 만약에 프로젝트가 마구 커져서 Bean이 엄청나게 많아지게 되면 AppConfig를 작성하기가 너무 막막하겠죠? 이를 위해서 자동으로 Bean들을 찾아서 구성해 주는 기능인 Component Scan을 한번 사용해 봅시다! 👉이전 글 보러가기 @Component 지정해 주기 찾아달라고 얘기하기 전에 우선 나를 찾아달라는 표시를 우리의 클래스들에게 데코레이터로 지정해 줄 수 있습니다.

  • 2024년 3월 04일

    안녕하세요! 너무 오랜만에 돌아왔죠? SW마에스트로를 지원하면서 코딩테스트 공부를 처음 시작해 보느라 블로그 쓸 시간이 부족했네요ㅠ 이 얘기는 나중에 따로 적기로 하고 저희는 오늘 싱글톤 패턴에 대해 알아보고 적용할 거예요. (혼자야?) 싱글인 것도 서러운데 싱글톤 패턴은 뭘까요ㅠㅠ 싱글톤 패턴이라는 말이 생소한 분들이 많을 것 같아요! 그럼 제일 먼저 싱글톤 패턴이 무엇인지와 우리 프로젝트에 왜 필요한지에 대해 설명드릴게요~ 👉이전 글 보러가기 싱글톤 패턴이란? 얘는 일단 소프트웨어의 디자인 패턴 중 하나입니다.

  • 2023년 12월 09일

    여러분 봄이 왔습니다!! 하핫. 사실은 글을 쓰는 현재는 12월 몹시 추운 날입니다. 롱패딩까지 입고있다구요… 하지만! 저희의 프로젝트에는 봄이 왔습니다! 드디어 Spring의 기능을 써볼 예정인데요. 바로 제목에 나와있는 @Configuration입니다. 저희는 이전글에서 눈빠지게 설정파일을 만들었는데 무슨 또 설정을 하라는거냐!!! 하시겠죠? 하지만 우리가 만든 AppConfig라는 세팅파일을 Spring이 관리해줄 수 있도록 설정해주는 과정을 배우는것이라 우리는 우리 프로젝트를 관리해야하는 짐을 스프링에게 좀 덜어낼 수 있을겁니다.

  • 2023년 12월 03일

    우려했던 일이 벌어졌습니다… 할인정책을 바꾸라고 하시네요?! 기어코 다 만들어버리니까 바꾸라는 사장님. 하지만! 저희는 여기서 사직서 대신 키보드와 마우스를 들고 객체지향을 통해 간단하게 수정을 진행해 볼까 합니다. 가보죠! 👉이전 글 보러가기 새 할인정책 만들기 바뀐 할인정책에 대해 들어볼까요? 사장님: 생각해보니까 1,000원으로 고정 할인하면 낱개별로 라면 하나씩 계속 주문하면 계속 무료인거잖아?? 산 금액에서 10%할인해주는걸로 당장 바꿔!! 이제 주문한 금액의 10% 할인으로 바꿔줘야겠네요.

  • 2023년 12월 03일

    안녕하세요! 이전글에서 코드만 많고 지루한 내용을 많이 해서 이번 글은 조금 가볍게 볼만한 내용을 준비했습니다. 백엔드를 통해 기능을 개발하다보면 이게 정말 내가 원하는대로 작동이 잘 될까? 하는 의심이 생길때가 자주 있죠. 그렇다고 이걸 잘 되길 기도하면서 적용이 될때동안 기다릴 수는 없는 노릇이고, 그리고 이전글처럼 따로 main함수를 만들어 돌려보고 하기도 복잡하고 지저분해지기만 합니다.

  • 2023년 12월 01일

    안녕하세요! 진짜 오랜만에 다시 글을 쓰게 되었습니다. 오늘은 저번 시간에 미처 못 구현한 주문 그리고 할인해주는 기능을 개발해보도록 합시다! 👉이전 글 보러가기 할인 정책 개발 먼저 기억나실지 모르겠지만 저희는 등급제를 운영하여 VIP등급이면 1,000원을 고정적으로 할인해주는 할인 정책으로 개발하기로 했었습니다.

  • 2023년 4월 20일

    안녕하세요. 오늘부턴 제대로 기능을 구현해보려고 합니다. 와아아아아아!!!!!!!!!! 갑자기 네이버의 대표님이 나에게 딱 와서 종이 하나만 딱 던져주고 갔다고 가정해볼게요. (이리와서 이것좀 만들어볼래요?) 거기엔 우리가 이제 네이버 쇼핑 플랫폼을 만들게 될 것이라고 적혀있네요.

  • 2023년 4월 18일

    안녕하세요! 또 왔습니다. 이번엔 제가 좋아하는 IntelliJ에 대해 설명드리는 시간입니다. 설치는 빠르게 빠르게 넘어가도록 하겠습니다. 👉이전 글 보러가기 IntelliJ 설치 요 사이트로 들어가서 설치파일을 다운로드해봅시다~ → IntelliJ IDEA 다운로드 본인에게 맞는 운영체제를 선택 후 무료/유료버전 중 어떤걸 사용할 건지 고르시면 됩니다! 만약 대학생이시라면 학교 메일을 통해 대학생 인증 후 Ultimate를 사용하시는것을 추천드립니다.

  • 2023년 4월 06일

    안녕하세요! 이젠 조금 더 실전으로 나가볼까 합니다. 바로 스프링 부트 프로젝트를 만드는 날입니다!! (드디어 실전!!) 프레임워크는 똑똑한 사람들이 만들어놓은 프로젝트 틀이 있다고 했잖아요? 그래서 우리는 해당 틀에 맞는 프로젝트를 만들어 볼 예정입니다. 👉이전 글 보러가기 Spring Initializr 접속하기 스프링 부트 프레임워크는 다른 프레임워크와는 조금 다르게 특이한 방식으로 프로젝트를 구성할 수 있습니다.

  • 2023년 3월 31일

    안녕하세요! 객체 지향 프로그래밍에 대해 빡세게 알아야 하는 순간이 와버렸습니다. 하지만 걱정마시죠. 생각보다 쉽습니다. 👉이전 글 보러가기 객체 지향 프로그래밍의 특징부터 알아보자 객체 지향 프로그래밍을 하려고 마음을 먹었다면 알아야 할 객체 지향의 특징이 4개가 있습니다.

  • 2023년 3월 21일

    안녕하세요! 이번에 스프링에 대해 공부하면서 공부한 것을 정리도 할 겸 게시글을 작성하게 되었습니다. 스프링 그 이전에 프레임워크가 무엇인지부터 감이 안잡히는 분들이 많을 것이라 생각됩니다. 저 또한 대학교에 다니면서 스프링을 무작정 배웠지만 프레임워크에 대한 이해도 없이 무작정 코드를 복붙만 하다보니 스프링을 왜 배워야하는지도 모르겠고 아예 흥미를 놓게 되더라구요.