Spring

    서블릿, JSP, MVC 패턴

    서블릿 서블릿은 자바로 웹 페이지를 동적으로 생성하는 서버 프로그램으로, 자바 코드 안에 HTML을 포함한다. 서블릿을 사용하면 동적으로 원하는 HTML을 만들 수 있으나, 자바 코드에 HTML을 만들어야 하므로 매우 복잡하고 비효율적 @WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form") public class MemberFormServlet extends HttpServlet { private MemberRepository memberRepository = MemberRepository.getInstance(); @Override protected void service(HttpServletRequest re..

    빈 생명주기와 콜백

    빈 생명주기 스프링 빈은 객체를 생성하고 의존관계 주입이 다 끝나야지만 필요한 데이터를 사용할 수 있는 준비가 완료되기 때문에, 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출된다. 따라서 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주고, 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 보낸다. 객체의 생성과 초기화 생성자는 파라미터로 필수정보를 받고 메모리를 할당해서 객체를 생성하는 책임을 가지는 반면에, 초기화는 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다. 따라서 생성자 안에서 초기화 작업을 하는 것보다 객체를 생성하는 부분과 초기화하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋다. 하지만 초기화 작업이 내부..

    의존관계 주입 방법

    Setter 주입 필드의 값을 변경하는 Setter 메서드를 통해서 의존관계를 주입받는 방법 선택, 변경 가능성이 있는 의존관계에 사용 @Component public class OrderService { private MemberRepository memberRepository; @Autowired public void setMemberRepository(MemberRepository memberRepository) { this.memberRepository = memberRepository; } } 필드 주입 필드에 바로 주입하는 방법으로, 외부에서 변경이 불가능하기 때문에 사용하지 않는 것이 좋다. 애플리케이션의 실제 코드와 관계없는 테스트 코드나 스프링 설정을 목적으로 하는 @Configurati..

    객체지향 설계와 스프링

    SOLID - 좋은 객체지향 설계의 5가지 원칙 SRP (단일 책임 원칙) 한 클래스는 하나의 책임만 가져야 한다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것 OCP (개방-폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야 한다. 만약 클라이언트가 구현 클래스를 직접 선택하는 경우, 구현 객체를 변경하면 클라이언트 코드를 변경해야 한다. (OCP 위반) 따라서 객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다. LSP (리스코프 치환 원칙) 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야한다는 것을 의미 ISP (인터페이스 분리 원칙) ..

    JPA와 ORM

    ORM 하이버네이트 ORM은 객체와 관계형 데이터베이스를 매핑하는 기술로, 객체와 테이블의 매핑관계만 설정해주면 ORM 프레임워크가 SQL을 만들어서 데이터베이스와 관련된 처리를 해준다. 매핑 방법만 알려주면 ORM 프레임워크가 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 처리해주기 때문에, 개발자는 객체지향 애플리케이션 개발에 집중할 수 있다. 자바의 ORM 기술에 대한 API 표준이 JPA이고, JPA를 구현한 ORM 프레임워크가 하이버네이트이다. MyBatis MyBatis나 스프링 JdbcTemplate은 ORM이 아니라 SQL 매퍼로, SQL 매퍼는 객체와 SQL을 매핑한다. SQL과 매핑할 객체만 지정하면 반복되는 JDBC API 사용과 응답 결과를 객체로 매핑하는 일을 SQL 매퍼가 대..

    JPQL과 페치 조인

    JPQL SQL이 데이터베이스 테이블을 대상으로 하는 데이터 중심의 쿼리라면, JPQL은 엔티티 객체를 대상으로 하는 객체지향 쿼리이다. JPQL을 사용하면 JPA는 JPQL을 분석한 다음 적절한 SQL을 만들어서 데이터베이스를 조회하고, 조회한 결과로 엔티티 객체를 생성해서 반환한다. 문법은 SQL과 비슷하지만, SQL을 추상화했기 때문에 특정 데이터베이스 SQL에 의존하지 않는다. SELECT List members = em.createQuery("SELECT m FROM Member m WHERE m.username = :username", Member.class) .setParameter("username", username) .getResultList(); JPQL 키워드는 대소문자를 구분하지 ..

    아파치 카프카 (Kafka)

    Kafka 아파치 카프카는 가장 새로운 메시징 시스템으로, ActiveMQ, Artemis, RabbitMQ와 유사하면서도 특유의 아키텍처를 가지고 있다. 카프카는 높은 확장성을 제공하는 클러스터로 실행되도록 설계되었으며, 클러스터의 모든 카프카 인스턴스에 걸쳐 토픽을 파티션으로 분할하여 메시지를 관리한다. 카프카의 토픽은 클러스터의 모든 브로커에 걸쳐 복제된다. 클러스터의 각 노드는 하나 이상의 토픽에 대한 리더로 동작하고, 토픽 데이터를 관리하고, 클러스터의 다른 노드로 데이터를 복제한다. 각 토픽은 여러 개의 파티션으로 분할될 수 있으며, 클러스터의 각 노드는 한 토픽의 하나 이상의 파티션의 리더가 된다. 설정 implementation 'org.springframework.kafka:spring-..

    비동기 메시지 전송 (JMS, RabbitMQ)

    비동기 메시징은 애플리케이션 간에 응답을 기다리지 않고 간접적으로 메시지를 전송하는 방법으로, 통신하는 애플리케이션 간의 결합도를 낮추고 확장성을 높일 수 있다. 스프링이 제공하는 비동기 메시징으로는 JMS, RabbitMQ, AMQP, 아프치 카프카가 있다. JMS JMS는 두 개 이상의 클라이언트 간에 메시지 통신을 위한 공통 API를 정의하는 자바 표준이다. 자바로 비동기 메시징을 처리하는 가장 좋은 방법으로, 모든 구현 코드가 공통 인터페이스를 통해 함께 동작할 수 있게 해준다. 스프링은 JmsTemplate라는 템플릿 기반의 클래스를 통해 JMS를 지원하며, 메시지 기반의 POJO도 지원한다. JmsTemplate를 사용하면 프로듀서가 큐와 토픽에 메시지를 전송하고 컨슈머는 그 메시지들을 받을 ..

    QueryDSL

    QueryDSL JPQL을 편하게 작성하도록 도와주는 빌더 클래스 모음으로, 문자가 아닌 코드 기반이기 때문에 문법 오류를 컴파일 단계에서 잡아낼 수 있다. 비표준 오픈소스 프로젝트로, JPA 뿐만 아니라 JDO, 몽고DB, Java 컬렉션 등도 거의 같은 문법으로 지원한다. 특징 쿼리 DSL의 핵심은 타입 안정성으로, 도메인 타입의 프로퍼티를 반영해서 생성한 쿼리 타입(Q)을 이용해서 쿼리를 작성한다. 또한 Query 인터페이스는 공통의 상위 인터페이스를 가지므로, 기반 기술에 상관없이 쿼리 경로와 오퍼레이션 모두 일관성있게 사용할 수 있다. JPA 쿼리 의존성 추가 // Spring Data JPA implementation 'org.springframework.boot:spring-boot-star..