멋진 개발자/Java & Spring

공통 기능 구현의 분리 웹 개발을 하다 보면 인증인가, 로깅, 트랜잭션 등 공통 로직으로 처리해야 되는 업무가 생긴다. 공통업무에 관련된 코드를 모든 페이지마다 작성해야 한다면 중복된 코드가 많아지게 되고 프로젝트 단위가 커질수록 서버에 부하를 줄 수도 있으며, 소스 관리도 되지 않는다. 공통부분은 빼서 따로 관리하는 것이 좋다. 공통처리를 위해 활용할 수 있는 것이 3가지가 있다. Filter(필터) : 핸들러 동작의 전 후 과정에 부가로직 처리, 웹 컨테이너에서 관리 Interceptor(인터셉터) : 이하 비슷함, 스프링 컨테이너에서 관리 AOP(관점 지향 프로그래밍) : 메서드 동작의 전 후 과정에 부가로직 처리 Filter, Interceptor, AOP의 흐름 요청이 들어오면 Filter → ..
스프링 컨테이너 스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트이다. 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공한다. 스프링에서는 자바 객체를 빈(Bean)이라 한다. 스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)하며, 생성된 빈에게 추가적인 기능을 제공한다. 스프링 컨테이너는 XML, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다. 스프링 부트(Spring Boot)를 사용하기 이전에는 xml을 통해 직접적으로 설정해 주어야 했지만, 스프링 부트가 등장하면서 대부분 사용하지 않게 되었다. 스프링 컨테이너의 종류 BeanFactory Beans 모듈에서 제공하며 가장 간단한 스프링 컨테이너이다. 객체 ..
지난 게시글에서 JPA의 N+1 발생에 대한 글을 작성하였다. 게시글 중에 Fetch Type이 즉시로딩인지 지연로딩인지에 따라서 연관된 객체를 가져오는 타이밍이 달랐는데, 그때 사용하는 즉시로딩, 지연로딩에 대해 알아보자 [항해 취업코스] 개발자 취준 기록 7일차 - N + 1 발생 이유와 해결방법 N + 1 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수(n)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 1:N 또는 N:1 관계를 가진 엔티티에서 발생한다. 현 skroy0513.tistory.com Fetch Type JPA가 하나의 Entity를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값이다. JPA는 사용자가 직접 쿼리를 생성하..
N + 1 연관 관계가 설정된 엔티티를 조회할 경우, 조회된 데이터 개수(n)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 1:N 또는 N:1 관계를 가진 엔티티에서 발생한다. 현상 재연 위 그림과 같이 설계된 테이블을 예를 들어보자 CategoryRepository에서 findAll을 호출하면, 카테고리만 불러오는 것이 아니라 카테고리와 OneToMany관계를 맺고 있는 제품의 결과도 같이 불러오게 된다 (N+1 발생) 발생 이유 N+1 문제가 발생하는 이유는 JPA가 JPQL을 분석해서 sql을 생성할 때는 글로벌 Fetch 전략을 참고하지 않고 오직 JPQL 자체만을 사용한다. 1. Fetch 전략이 즉시 로딩인 경우 findAll()을 한 순간 select c from Cat..
Spring Security 인증, 권한 관리 그리고 데이터 보호 기능을 포함하여 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는데 도움을 주는 Spring의 강력한 프레임워크이다. Spring Security는 '인증'과 '인가'에 대한 부분을 Filter 흐름에 따라 처리하고 있다. 클라이언트의 요청을 처리하고 그 결과를 반환하는 기술을 서블릿이라고 부르는데, 서블릿 Filter는 HTTP 요청을 가로채 전처리 및 후처리를 수행할 수 이도록 만들어진 기술이다. Spring Security는 이 서블릿 Filter에 Security Filter를 거치게 해서 인증, 인가 및 여러 보안처리를 한다. Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해 주기 때문에 개발자 입..
Annotation 주석을 통해 타인에게 정보를 제공하여 주는 반면, Annotaion은 특정 코드를 사용하여 컴퓨터에게 정보를 제공하여 준다. 역할 컴파일러에게 문법 에러를 체크하도록 정보를 제공 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공 런타임 시 특정 기능을 실행하도록 정보를 제공 어노테이션은 @을 사용하여 작성하며, 해당 타깃에 대한 동작을 수행하는 프로그램 외에는 다른 프로그램에 영향을 주지 않는다. 종류 크게 세 가지로 구분된다. 자바에서 기본적으로 제공하는 표준 어노테이션과 어노테이션을 정의하는 데 사용되는 메타 어노테이션, 마지막으로 사용자 어노테이션이 있다. 표준 어노테이션 자바에서 기본적으로 제공하는 어노테이션이다. @Override : 컴파일러에게 메서드를 오..
MVC MVC는 Model, View, Controller의 약자이다. 하나의 프로젝트를 구성할 때 그 구성요소를 세 가지의 역할로 구분한 패턴을 말한다. 위의 그림처럼 사용자가 Controller를 조작하면 Controller는 Model을 통해서 데이터를 가져오고 그 정보를 바탕으로 시각적인 표현을 담당하는 View를 제어해서 사용자에게 전달하게 된다. 모델, Model 애플리케이션의 정보, 데이터를 나타낸다. Model이 가지고 있는 규칙은 다음과 같다. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다. 화면안에 글자가 표현된다면, 글자의 위치 정보, 글자 내용, 글자의 포맷 정보 등을 가지고 있어야 한다. View나 Controller에 대해서 어떤 정보도 알지 않아야 한다. 데이터 변..
IoC (Inversion of Control) "제어의 역전" 메서드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 스프링에게 제어권을 넘기는 것을 의미한다. 이전까지는 개발자가 객체의 생성을 관리하며 제어했지만, 스프링을 사용하게 되면 스프링 컨테이너에게 제어권을 넘겨 스프링 컨테이너가 흐름을 제어하게 된다. 스프링과 같은 프레임워크를 사용할 때 Controller, Service 같은 객체들의 동작을 구현은 우리가 직접 하지만, 해당 객체들이 어느 시점에 호출될지는 신경 쓰지 않는다. 단지 프레임워크가 요구하는 대로 객체를 생성하면, 프레임워크가 해당 객체들을 가져다가 생성하고, 메서드를 호출하고, 소멸시킨다. 프로그램의 제어권이 역전된 것이다. IoC는 원칙이며, 세부 구현 사항은 개발자에게..
Java에는 Map이라는 인터페이스 도구가 있다. 대표적으로 Map, HashMap, TreeMap, LinkedHashMap이 있다. Map 기본적으로 Map은 key-value의 구조로 구성되어 데이터를 저장한다. key를 가지고 저장된 value를 찾을 수 있다. key를 이용한 데이터 검색에 최적화되어 있으나, 동일한 key에 다른 데이터 value가 저장되어 있을 경우 기존에 저장된 데이터는 덮어씌워져 사라진다. 중복된 key는 존재 할 수 없다. HashMap 가장 일반적으로 사용되는 방식 중 하나이다. HashMap은 자료구조로 배열(array)을 사용한다. 배열은 '인덱스'를 통해 바로 접근이 가능하다는 장점이 있다. HashMap은 해싱(Hashing)을 통해 Map 데이터가 저장될 위치..
가비지 컬렉터란 (역할) 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 일을 한다. C나 C++에서는 가비지 컬렉터가 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 하는 반면 Java는 JVM에 탑재되어 있는 가바지 컬렉터가 메모리 관리를 대행해 주기 때문에 개발자 입장에서 메모리 관리, 메모리 누수 문제에 대해 완벽하게 관리하지 않아도 되어서 오롯이 개발에만 집중할 수 있다. 더 이상 필요 없어진 메모리를 쓰레기(Garbage)라고 하고 이 쓰레기를 효과적으로 처리하는 작업을 GC(Garbage Collection)이라고 부른다. 단점 메모리가 언제 해제되는지 개발자가 정확히 알 수 없다..
개념과 특징 클래스(Class) 개념 객체를 만들어 내기 위한 설계도 혹은 틀 연관되어 있는 변수와 메서드의 집합 객체(Object) 개념 소프트웨어 세계에 구현할 대상 클래스에 선언된 모양 그대로 생성된 실체 특징 '클래스의 인스턴스(instance)'라고도 부른다. 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다. 클래스의 타입으로 선언되었을 때 '객체'라고 부른다. 인스턴스(Instance) 개념 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체 객체를 소프트웨어에 실체화하면 그것을 '인스턴스'라고 부른다. 실체화된 인스턴스는 메모리에 할당된다. 특징 인스턴스는 객체에 포함된다고 볼 수 있다. 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다. 추상적인 개념과 구체적인 ..
JVM의 메모리 할당방식 JVM은 기본적으로 Stack, Heap Memory 라 불리는 두 가지 저장 공간을 이용해 메모리를 할당한다. 이들에 메모리를 할당하는 방법은 바이트 코드를 한 줄 한 줄 읽는 것이다. 한 줄 한 줄 읽힌 값들은 Stack영역에 차곡차곡 쌓인다 또한 Java는 Call By Value로서 동작하는데, Java의 원시타입(Primitive Type)과 참조타입(Reference Type)에 따라 스택, 힙 메모리를 사용하는 것이 다르다. 스택 메모리 - 원시타입(Primitive Type) 힙 메모리 - 참조타입(Reference Type) 자세한 것은 아래 포스팅을 참조하기 바란다. [항해 취업코스] 개발자 취준 기록 1일차 - Call by Reference Call by R..
0. 들어가기 전 특정시각에 오픈하는 상품을 재고수보다 훨씬 많은 유저들이 구매하려 시도했을 때 어떻게 하면 OverSelling이 일어나지 않을까?? 1. synchronized 붙이기 @Transactional public synchronized OrderDto preCreate(Long userId, Long productId) { // db에서 재고를 줄일 것 stockDbClient.decreasePreStock(productId); // 주문 상태 성공으로 바꾸기 OrderDto dto = orderClient.successOrder(productId, userId, "GENERAL"); return dto; } 문제없이 잘 실행이 되었다. 하지만 synchronized는 나의 프로젝트에서 쓰..
JVM에 대해선 이전 포스팅을 참조! [항해 취업코스] 개발자 취준 기록 2일차 - JVM의 구성과 특징 JVM (Java Virtual Machine) 직역하면 "자바 가상 기계", Java로 작성된 코드들을 1,0밖에 모르는 컴퓨터가 알 수있게 OS독립적으로 실행 가능하게 해주는 것이다. JVM이 .java 파일이 컴파일 되고 실질적으로 skroy0513.tistory.com 이번에는 .java 파일이 어떻게 컴파일 되고 JVM에서 어떻게 작동하는지 공부해보자 Java Compiler (javac) * 소스 코드 - 사람이 직접 작성한 코드 - 기계는 이해할 수 없는 코드 (고레벨 언어) * 바이트 코드 - CPU가 아닌 가상머신(JVM)이 이해할 수 있는 코드 - 고레벨 언어로 작성된 소스코드를 가..
JVM (Java Virtual Machine)직역하면 "자바 가상 기계", Java로 작성된 코드들을 1,0밖에 모르는 컴퓨터가 알 수있게 OS독립적으로 실행 가능하게 해주는 것이다. JVM이 .java 파일이 컴파일 되고 실질적으로 컴퓨터가 알 수 있게 해주는 과정은 다음 포스팅을 참조 바란다. [항해 취업코스] 개발자 취준 기록 3일차 - Java의 컴파일 과정(JVM)JVM에 대해선 이전 포스팅을 참조! https://skroy0513.tistory.com/22 [항해 취업코스] 개발자 취준 기록 2일차 - JVM의 구성과 특징 JVM (Java Virtual Machine) 직역하면 "자바 가상 기계", Java로 작성된 코드들을 1,0skroy0513.tistory.comJVM의 특징컴파일된 ..
개발의 WinG
'멋진 개발자/Java & Spring' 카테고리의 글 목록 (2 Page)