일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- foreignkey
- 추후정리
- Query
- 메세지수정
- application.yml
- docker명령어
- appspec.yml
- 예약
- 컨테이너실행
- 커밋메세지수정
- 메소드명
- 적용우선순위
- 네이티브쿼리
- 포트
- 2 > /dev/null
- 테스트
- 검색
- MySQL
- 참조키
- querydsl
- ubuntu
- 외부키
- AuthenticationEntryPoint
- subquery
- 테스트메소드
- appspec
- WeNews
- ㅔㄴ션
- EC2
- 서브쿼리
- Today
- Total
제뉴어리의 모든것
[Section2] [관계형 데이터베이스] [Spring Core] Spring Framework 기본 본문
Framework이란?
기본적으로 프로그래밍을 하기 위한 어떠한 틀이나 구조를 제공.
그리고 그러한 틀, 구조 뿐만 아니라 라이브러리 또한 제공 해줌.
그래서 핵심 로직 (비즈니스 로직) 을 개발 하는데 집중 할 수가 있게 됨.
라이브러리란?
사전적 의미는 아래와 같다.
라이브러리는 혼자서 동작하는 완전한 프로그램이 아닌, 특정한 부분 기능만을 수행하도록 제작된, 컴파일되어 기계어의 형태로 (또는 대상 플랫폼에 따라서는 바이트코드로) 존재하는 프로그램이다.
즉, 개발시 뭔가 전체적인 틀을 제공하는것이 아닌 부분 기능을 하는 클래스와 메소드들을 제공 하는것이다.
프레임워크와 라이브러리 차이
프로그래밍을 할때 제어권이 개발자에게 있느냐 없느냐에 따라 구별할 수 있다
POJO (Plain Old Java Object)
POJO란 순수한 JAVA 객체를 의미함.
즉, 어떠한 프레임워크나 라이브러리에 종속되지 않은 순수 자바 객체이다.
POJO가 되는 조건
1. Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다
2. 특정환경에 종속적이지 않아야 한다.
- POJO 프로그래밍 방식이 왜 필요한가.
- 특정 규약에 종속되지 않아 객체지향 설계를 할 수 있다.
- 특정 환경에 종속되지 않아 테스트하기 좋다.
- 특정 규약에 종속되지 않아 로우레벨 코드와 비즈니스 코드가 분리되어 깔끔한 코드 작성이 가능하다.
POJO의 진정한 가치는 자바의 객체지향적인 특징을 살려 비즈니스 로직에 충실한 개발이 가능하도록 하는 것
서블릿이란?
동적 웹페이지를 만들때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술. 자바의 HttpServlet 클래스를 사용하는 기술이다.
참조 : https://coding-factory.tistory.com/742 . https://mangkyu.tistory.com/14
POJO 프로그래밍을 하기 위해 Spring에서 지원하는 기술 3가지
- IoC/DI
- AOP
- PSA
참고 : https://www.nowwatersblog.com/springboot/springstudy/POJO
IoC (Inversion of Control)
애플리케이션의 로직 흐름 주도권이 뒤바뀐것. (기존엔 개발자, IoC의 경우엔 프레임워크가 가지고 있다)
개발자가 특정 메소드를 직접 호출하거나 하는것이 아니라, 특정상황이 됬을때 프레임워크가 알아서 특정 메소드를 호출시킨다던가 하는 것을 말한다. (프레임워크의 라이프사이클에 맞춰 개발자가 필요한 사이클 부분에 비즈니스 로직을 집어 넣는것이다)
프로그램의 주도권이 프레임워크에게 있는것이다.
DI (Dependency Injection)
자신(클래스) 내부에서 특정 객체의 기능을 사용하기 위해, 생성자를 통해 해당 객체를 전달 받는것.
스텁이란?
메소드가 호출되면 미리 준비된 고정 된 더미 데이터로 응답하는것.
강한 결합
클래스 내부에서 특정 클래스의 기능을 사용하기 멤버필드로 해당 클래스의 타입으로 멤버필드를 선언해두었다.
그리고 new 객체로 해당 클래스의 객체를 생성하였다.
이런것은 강한 결합이라고 한다.
느슨한 결합
강한 결합에선 클래스내의 멤버필드의 참조변수 타입을 클래스로 하였지만, 느슨한 결합에서는 인터페이스로 한다.
그래서 어떤 구현체가 들어오더라도 클래스내의 코드를 변경하지 않아도 되게끔 한다.
이때 의존성 주입까지 이루어지면 코드를 전혀 바꾸지 않아도 된다.
멱등성이란?
스텁처럼 몇번을 호출해도 (몇번을 반복해도) 동일한것.
AOP (Aspect Oriented Programming)
번역하자면 관심 지향 프로그래밍, 일반적으로 들었던 관점 지향보다 더 와닿는 말이다.
예를 들어 설명해보자.
개발을 하면서 코드의 종류를 나누자면,
비즈니스로직 부분 코드와 비즈니스로직을 작성하기 위해 필요한 빌드업같은 코드들이 있다.
예를 들어, 신규 회원을 데이터베이스에 저장하는 로직이라면
멤버 데이터를 데이터베이스에 저장하는 몇줄이 비즈니스 로직의 전부일 것이다.
그런데, 데이터베이스가 갑자기 떡하니 나타나는 것이 아니다.
데이터베이스를 코드상에서 사용하기 위해 Connection을 얻어오는 작업이 필요하다.
그리고 그런 작업들은 DB작업을 필요로하는 비즈니스 로직 구동시 항상 필요할것이다.
그런 어떤 어떤 애플리케이션이나 공통적으로 들어가는 비즈니스 로직을 돌리기 위해 필요한 코드들이
공통 관심 부분(Cross-cutting concern) 이다. 부가적인 관심 사항 이라고도 한다.
그리고 신규 회원을 저장하고 그 신규 회원이 특정 금액 이상을 샀을때 등급을 올려준다던가 하는 애플리케이션마다 가지고 있는 주목적 기능을 하는 코드들을 핵심 관심 사항(Core concern) 이라고 한다.
그리고 이렇게 핵심 관심사항 코드와 부가적인 관심사항 코드를 분리하여 비즈니스 로직에 집중하는것이 관심 지향 프로그래밍이다.
AOP 사용하는 이유
- 코드의 간결성
- 객체 지향 설계에 맞는 구조
- 코드의 재사용
- 비즈니스 로직에만 집중 가능
+ @Transactional 애노테이션
해당 애노테이션이 붙은 메소드를 하나의 트랜잭션으로 묶어줌.
PSA (Portable Service Abstraction)(일관된 서비스 추상화)
서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA 라고 한다.
다르게 설명 하자면 클라이언트가 추상화된 상위 클래스 혹은 인터페이스를 일관되게 바라보며 하위 클래스의 기능을 사용하는것이 PSA기본 개념이다 라고 할 수 있다.
PSA 필요 이유
어떤 기술을 사용하기 위한 해당 기술의 접근 방식을 일관되게 유지함으로써 어떤 기술을 사용하더라도 기존 코드를 최소한의 변경만 하도록 하기 위함이다.
쉽게말해,
+ 클라이언트라는 개념
클라이언트라는 말은 개발쪽 외에도 많은 분야에서 쓰인다.
뭔가 요청을 하는 입장이 클라이언트가 되는것이다.
그리고 그 요청에 응하여 결과를 내놓는것이 서버이다.
웹분야에서는 프론트엔드를 클라이언트라고 할 수도 있고, 브라우저는 클라이언트라고 할 수도 있다.
그런데, 백엔드를 의미하는 서버의 코드 상에서도 클라이언트라는 개념이 있을 수 있다.
예를 들어, 서버로 신규회원을 추가해달라는 요청이 들어왔다.
이 경우, 컨트롤러는 요청을 받으면서 함께 받은 매개변수들을 서비스영역 (Service 컴포넌트)으로 넘길것이다.
그럼 그 서비스영역은 회원 데이터들을, 직접 DB와 소통하는 레포지토리에게 넘기는데, 이때 서비스 영역이 클라이언트라고 할 수 있다.
+ 추상화
어떤 클래스의 본질적인 특성(기능)만을 추출하여 일반화 하는것을 추상화 라고 한다.
'코드스테이츠 > 정리 블로깅' 카테고리의 다른 글
[Section2] [Spring Core] Spring Framework의 핵심 개념 - 자바 기반 컨테이너 설정 (0) | 2022.08.12 |
---|---|
[Section2] [관계형 데이터베이스] [Spring Core] Spring Framework 기본 2 (0) | 2022.08.10 |
[Section2] [관계형 데이터베이스] 데이터베이스 정규화 [추후 정리] (0) | 2022.08.08 |
[Section2] [네트워크] 웹 애플리케이션 작동원리 (0) | 2022.08.03 |
[Section2] [코딩테스트 준비] 탐욕 알고리즘 (Greedy) (0) | 2022.07.29 |