Spring
[Spring 핵심 원리 - 기본편] @Configuration과 바이트코드 조작의 마법
@Configuration과 바이트코드 조작의 마법 스프링 컨테이너는 싱글톤 레지스트리다. 따라서 스프링 빈이 싱글톤이 되도록 보장해주어야 한다. 그런데 스프링이 자바 코드까지 어떻게 하기는 어렵다. 저 자바 코드를 보면 분명 3번 호출되어야 하는 것이 맞다. 그래서 스프링은 클래스의 바이트코드를 조작하는 라이브러리를 사용한다. 모든 비밀은 @Configuration을 적용한 AppConfig에 있다. @Test void configurationDeep() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); //AppConfig도 스프링 빈으로 등록된다. AppConfig bean = ac.getBean(Ap..
[Spring 핵심 원리 - 기본편] 싱글톤 방식의 주의점
싱글톤 방식의 주의점 싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 무상태(stateless)로 설계해야 한다. 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다. 가급적 읽기만 가능해야 한다. 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다. ThreadLocal이란? 일반 변수의 수명은 특정 코드 블록(예, 메서드 범위, for 블록 범위 등) 범위 내에서만 유효하다. { int a = 10; ...
[Spring 핵심 원리 - 기본편] 싱글톤 패턴
싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 그래서 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다. private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다. 싱글톤 패턴을 적용해보자 public class SingletonService { private static final SingletonService instance = new SingletonService(); public static SingletonService getInstance() { return instance; } private SingletonService() {} public void logic() { System.out.println("싱글톤..
[JPA] QueryDSL 이란
QueryDSL QueryDSL 이란 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크 SQL, JPQL을 코드로 작성할 수 있게끔 도와주는 오픈소스 빌더 API 사용 목적 String 방식의 쿼리문을 작성할 시 생기는 문법 오류들을 예방해줌 IDE의 코드 자동완성 기능을 사용 동적 쿼리를 만들기 쉽다 리팩토링에 용이하다 -> 코드를 분석하기 용이 의존성 설정 (build.gradle) plugins { id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } dependencies { implementation 'com.querydsl:querydsl-jpa' } def querydslDir = "$buildDir/generat..
[Spring] Spring Security란?
대부분의 시스템에서는 회원의 관리를 하고 있고, 그에 따른 인증(Authentication)과 인가(Authorization)에 대한 처리를 해주어야 한다. Spring에서는 Spring Security라는 별도의 프레임워크에서 관련된 기능을 제공하고 있는데, 이번에는 Spring Security에 대해서 알아보도록 하겠다. 1. Spring Security란? [Spring Security란?] Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. Spring Security는 ‘인증’과 ‘권한’에 대한 부분을 Filter 흐름에 따라 처리하고 있다. Filter는 Dispatcher Servelet으로 가기 전에 적용되므..
좋은 객체 지향 설계의 5가지 원칙 (SOLID)
SOLID 클린 코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리 SRP: 단일 책임 원칙 (Single Responsibility Principle) OCP: 개방-폐쇄 원칙 (Open/Closed Principle) LSP: 리스코프 치환 원칙 (Liskov Substitution Principle) ISP: 인터페이스 분리 원칙 (Interface Segregation Principle) DIP: 의존관계 역전 원칙 (Dependency Inversion Principle) SRP 단일 책임 원칙 한 클래스는 하나의 책임만 가져야 한다. 하나의 책임이라는 것은 모호하다. 클 수 있고, 작을 수 있다. 문맥과 상황에 따라 다르다. 중요한 기준은 변경이다. 변경이 있을 때 파급 효..
[Spring] 좋은 객체 지향 프로그래밍이란?
객체 지향 객체 지향의 특징 추상화 캡슐화 상속 다형성 객체 지향 프로그래밍 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고 데이터를 처리할 수 있다. (협력) 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 유연하고 변경이 용이? 레고 블럭 조립하듯이 키보드, 마우스 갈아 끼우듯이 컴푸타 부품 갈아 끼우듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법 다형성 (Polymorphism) 다형성의 실세계 비유 실세계와 객체 지향을 1:1로 매칭X 그래도 실세계의 비유로 이해하기에는 좋음 역할과..
[Spring] JPA 란?
JPA? JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다. 우선 JPA에 앞서, 먼저 ORM에 대해 알아보도록 하자. ORM(Object-Relational Mapping) 우리가 일반적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화해 주는 것이라고 보면 된다. 장점 SQL문이 아닌 Method를 통해 DB를 조작할 수 있어..
[Tip] 패키지 구조는 어떻게 짜는 게 맞을까?
문제 프로젝트를 진행하던 와중에 IDE의 왼쪽을 쳐다보면 수많은 Service 클래스들을 보고 기겁을 하곤 한다. 프로젝트에서는 Service 클래스에게는 SRP를 엄격하게 적용시켜 Service를 기능별로 작게 나누는 것이 목표 중 하나이다. 그래서 Service 클래스가 굉장히 많은 것을 확인할 수 있다. 요즘은 도메인형 패키지 구조를 사용하라는 것이 추세인듯 하다. 아직 계층형과 도메인형간의 대립이 있지만 거의 도메인형 패키지 구조가 좋다는 추세로 가는 것 같다. 해결 다음은 도메인형 패키지 구조로 변경하기 전의 어떤 프로젝트의 패키지 구조이다. com ㄴ dsm ㄴ kkoribyeol ㄴ configuration ㄴ controller | ㄴ request | ㄴ response | ㄴ filte..
[Spring] DTO는 왜 써야 하나?
DTO (Data Transfer Object) DTO란 계층간 데이터 교환을 위해 사용하는 객체(Java Beans) DTO는 왜 필요할까? 1. Entity 2. Service 3. Dto 4.Controller 위 예제 코드의 테스트 코드는 Posts라는 엔티티를 생성하는 코드이다. 이를 위해 맨 처음에 PostsSaveRequestDto라는 Dto 객체를 빌더 패턴으로 생성하고 Dto를 컨트롤러에게 던져준다. 컨트롤러는 해당 Dto를 다시 Service에게 넘겨주고, Service 단에서 JPA를 이용하여 생성된 객체를 저장한다. 그런데 DTO와 Entity는 거의 똑같은 것 같은데, 왜 변환을 해서 사용해야 하며, 그렇다면 언제 DTO가 필요할까? Entity클래스와 거의 유사한 형태임에도 DT..