Jekyll2026-02-22T21:05:54+09:00https://devvoon.github.io//feed.xmldevvoon blog아름다운 개발자 블로그devvoon[email protected][Spring] ORM, JPA, hibernate, iBatis/MyBatis 개념 및 차이점2021-06-09T22:37:00+09:002021-06-09T22:37:00+09:00https://devvoon.github.io//spring-orm<![CDATA[

ORM 기술도 트렌드가 변화하고있다. 한참동안은 MyBatis가 대세를 이루더니 요즘은 JPA+JPQL 이 대세라고 한다.
MyBatis는 동적쿼리를 작성할 때 xml로 태그를 열고 닫아야 하는 귀찮은 부분이 분명 있었지만,
SQL을 직접작성하다보니 쿼리를 볼 때 매우 직관적이고, Oracle의 내장함수를 이용할 수 있는 부분이 커다란 장점이였다.
최근의 JPA+JPQL의 조합은 어떠한가. CRUD를 직접 작성하지 않아도 되고, DB가 바뀌어도 쿼리작성은 JPA의 몫이니 크게 신경쓰지 않아도 된다.
그러나 JPA자체를 학습하는데는 또 다른 이해를 요구하는 일이다.
그리고 사실 JPA는 ORM 기술의 명세일뿐 실제 사용하려면 Hibernater같은 프레임워크가 필요하니 또다른 학습이 늘어난다.

무슨 기술이든 장단점은 존재하고 어떤 기술을 채택하여 사용할지를 결정하는 것 또한 프로그램에 큰 영향을 미치니
무엇을 사용하는 것이 좋다라고 말하긴 보단 잘 선택해서 사용하기를..

ORM이란?

  • ORM의 표준 JPA와 JPA를 표준을 따르고 구현한 hibernate, iBatis/MyBatis
  • ORM : JPA Hibernate, iBatis/MyBatis

ORM (Object-relational mapping : 객체 관계 매핑)

  • 자바객체와 데이터베이스 테이블간의 매핑처리
  • 객체는 객체대로 설계
  • 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • ORM 프레임워크가 중간에서 매핑
  • 대중적인 언어에는 대부분 ORM 기술이 존재
  • 데이터베이스에 저장된 데이터와 개체를 매핑하는 것은 프로그래밍 전략입
  • 데이터 생성, 데이터 조작 및 데이터 액세스를 단순화 함

Java ORM Frameworks 종류

  • Enterprise JavaBeans Entity Beans
  • Java Data Objects
  • Castor
  • TopLink
  • Spring DAO
  • Hibernate

JPA (Java Persistence API)

  • 자바 진영의 ORM 기술 표준 (사양)
  • JPA는 객체 지향 도메인 모델과 관계형 데이터베이스 시스템 간의 다리 역할
  • JPA는 자체적으로 어떤 작업도 수행하지 않음(사양일 뿐)
  • Hibernate, TopLink 및 iBatis와 같은 ORM 도구는 데이터 지속성을 위한 JPA 사양을 구현
  • ORM 도구에서 다른 도구로 애플리케이션을 전환하려는 경우 쉽게 수행 가능
  • javax.persistence 패키지에 정의
  • 자바 지속성 쿼리 언어 데이터베이스 작업을 수행하는 객체 지향 쿼리 언어 (JPQL) 사용

동작 방법

  • JAVA가 JDBC API에 명령을 내리는 것이라니라 JPA를 사용하면 JPA가 JDBC API를 사용해서 DB와 통신하고 SQL을 호출하고 반환
  • 저장시 JPA가 Entity를 분석해서 SQL을 생성함
  • 조회시 JPA가 SQL을 생성하여 SQL을 생성
  • 패러다임 불일치 해결

장점

  • 개발이 편리함 : 기본적인CRUD용 SQL을 직접 작성하지 않아도 됨
  • 데이터베이스에 독립적 개발 가능 : JPA는 데이터베이스에 종속적이지 않아서 데이터베이스가 변경되더라도 JPA가 해당 데이터베이스에 맞는 쿼리 알아서 생성해줌
  • 유지보수가 쉬움: 테이블 변경시 JPA의 엔티티만 수정하면 됨

단점

  • 학습이 어려움
  • 특정 데이터베이스의 함수를 사용하지 못함
  • 테이블을 객체지향 설계가 필요

Hibernate (하이버네이트)

  • 2001 년 Gavin King이 만든 오픈 소스 영구 프레임 워크
  • 데이터베이스와 상호 작용하는 Java 애플리케이션의 개발을 단순화하는 Java 프레임 워크
  • 오픈 소스, 경량의 ORM (Object Relational Mapping) 도구
  • 데이터 지속성을 위해 JPA (Java Persistence API) 사양을 구현(JPA 구현 중 하나 )
  • 자바 객체와 데이터베이스 테이블사이의 매핑을 관리하려고 만들어진 도구 ORM
  • 개체들의 도메인 객체가 있어야 하는데 단순한 POJO이고 각 객체는 데이터테이블과 간단하게 연결
  • JDBC의 한계를 극복하는 데 사용
  • org.hibernate 패키지에 정의 됨

동작방법

  • Java Application내 Hibernate의 Configuration 파일(Hibernate.Properties)과 Hibernate XML Mapping 파일을 사용하여 데이터베이스에 대한 특정 작업을 수행하는 지속성 논리를 작성하여 특정 클래스의 객체(영속성 객체)를 만듦
  • Hibernate Framework 내부의 SessionFactory, Session , Transaction 등과 같은 많은 객체를 사용하여 Java Application과 상호작용
  • JDBC (Java Database Connectivity), JTA (Java Transaction API) 및 JNDI (Java Naming Directory Interface)와 같은 기존 Java API를 통해서 데이터베이스로 이동하여 지속성 논리를 수행하는 상호작용
  • 데이터베이스와 상호작용 (CRUD 지속성 논리를 수행)

장점

  • 오픈 소스 및 경량 : LGPL 라이선스하에 오픈 소스이며 경량임
  • 빠른 성능 : 최대 절전 프레임 워크에서 캐시가 내부적으로 사용되기 때문에 최대 절전 프레임 워크의 성능이 빠름
  • 데이터베이스 독립 쿼리 : HQL (Hibernate Query Language)은 SQL의 객체 지향 버전데이터베이스 독립적 인 쿼리를 생성 > 특정 쿼리를 작성할 필요가 없음
  • 자동 테이블 생성 : Hibernate 프레임 워크는 데이터베이스 테이블을 자동으로 생성하는 기능을 제공 > 데이터베이스에 수동으로 테이블을 만들 필요가 없음
  • 복잡한 조인 단순화 : 하이버 네이트 프레임 워크에서는 여러 테이블에서 데이터를 가져 오는 것이 쉬움
  • 쿼리 통계 및 데이터베이스 상태 제공 : Hibernate는 쿼리 캐시를 지원하고 쿼리 및 데이터베이스 상태에 대한 통계를 제공

MyBatis

  • 오픈 소스, 경량의 지속성 프레임 워크
  • 가장 간단한 지속성 프레임 워크

iBatis

  • iBatis는 SQL에 기반한 데이터베이스와 자바, 닷넷(.NET), 루비(Ruby) 등을 연결시켜 주는 역할을 하는 영속성 프레임워크(Persistence Framework)
  • 연결은 프로그램의 소스코드에서 SQL 문장을 분리하여 별도의 XML 파일로 저장하고 이 둘을 서로 연결시켜주는 방식으로 작동
  • iBatis는 사용자가 SQL 문장을 만들면 그에 적합한 객체모델을 생성하는 방식으로 작동
    • 모든 SQL을 XML로 작성하고 SQL문을 사용하는 DAO클래스를 설계해서 SQL호출하는 방식
  • 팀 전원이 아파치 소프트웨어 재단에서 구글 코드로 이전하면서 중단됨
  • 새로운 프레임워크 MyBatis로 변경

장점

  • 인터페이스와 애노테이션을 통해서 SQL문 설정하고 처리할 수 있음
  • XML만을 이용해서 SQL문을 설정 
  • DAO에서는 xml찾아서 실행하는 코드 작성하는 방식 
  • SQL수정 유지보수적합하나 복잡성 증가
  • 동적 Query 지원
  • ORM 지원

결론

MyBatis Hibernate
SQL을 생성하고 싶을 경우 SQL 을 생성하고 싶지않을 경우
데이터베이스에 따라 달라질 수 있는 SQL을 사용 데이터베이스와 독립적인 HQL을 사용
ResultSet을 POJO 객체에 매핑하므로 테이블 구조에 대해 신경 쓸 필요 없움 Java POJO 객체를 데이터베이스 테이블에 매핑

references

https://practice.geeksforgeeks.org/problems/what-is-orm https://www.javatpoint.com/hibernate-tutorial https://www.geeksforgeeks.org/introduction-to-hibernate-framework/ https://www.tutorialspoint.com/hibernate/orm_overview.htm https://www.geeksforgeeks.org/difference-between-jdbc-and-hibernate-in-java/ https://www.javatpoint.com/jpa-vs-hibernate https://www.tutorialspoint.com/mybatis/mybatis_overview.htm

]]>{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[ORM 기술도 트렌드가 변화하고있다. 한참동안은 MyBatis가 대세를 이루더니 요즘은 JPA+JPQL 이 대세라고 한다. MyBatis는 동적쿼리를 작성할 때 xml로 태그를 열고 닫아야 하는 귀찮은 부분이 분명 있었지만, SQL을 직접작성하다보니 쿼리를 볼 때 매우 직관적이고, Oracle의 내장함수를 이용할 수 있는 부분이 커다란 장점이였다. 최근의 JPA+JPQL의 조합은 어떠한가. CRUD를 직접 작성하지 않아도 되고, DB가 바뀌어도 쿼리작성은 JPA의 몫이니 크게 신경쓰지 않아도 된다. 그러나 JPA자체를 학습하는데는 또 다른 이해를 요구하는 일이다. 그리고 사실 JPA는 ORM 기술의 명세일뿐 실제 사용하려면 Hibernater같은 프레임워크가 필요하니 또다른 학습이 늘어난다. 무슨 기술이든 장단점은 존재하고 어떤 기술을 채택하여 사용할지를 결정하는 것 또한 프로그램에 큰 영향을 미치니 무엇을 사용하는 것이 좋다라고 말하긴 보단 잘 선택해서 사용하기를.. ORM이란? ORM의 표준 JPA와 JPA를 표준을 따르고 구현한 hibernate, iBatis/MyBatis ORM : JPA Hibernate, iBatis/MyBatis ORM (Object-relational mapping : 객체 관계 매핑) 자바객체와 데이터베이스 테이블간의 매핑처리 객체는 객체대로 설계 관계형 데이터베이스는 관계형 데이터베이스대로 설계 ORM 프레임워크가 중간에서 매핑 대중적인 언어에는 대부분 ORM 기술이 존재 데이터베이스에 저장된 데이터와 개체를 매핑하는 것은 프로그래밍 전략입 데이터 생성, 데이터 조작 및 데이터 액세스를 단순화 함 Java ORM Frameworks 종류 Enterprise JavaBeans Entity Beans Java Data Objects Castor TopLink Spring DAO Hibernate JPA (Java Persistence API) 자바 진영의 ORM 기술 표준 (사양) JPA는 객체 지향 도메인 모델과 관계형 데이터베이스 시스템 간의 다리 역할 JPA는 자체적으로 어떤 작업도 수행하지 않음(사양일 뿐) Hibernate, TopLink 및 iBatis와 같은 ORM 도구는 데이터 지속성을 위한 JPA 사양을 구현 ORM 도구에서 다른 도구로 애플리케이션을 전환하려는 경우 쉽게 수행 가능 javax.persistence 패키지에 정의 자바 지속성 쿼리 언어 데이터베이스 작업을 수행하는 객체 지향 쿼리 언어 (JPQL) 사용 동작 방법 JAVA가 JDBC API에 명령을 내리는 것이라니라 JPA를 사용하면 JPA가 JDBC API를 사용해서 DB와 통신하고 SQL을 호출하고 반환 저장시 JPA가 Entity를 분석해서 SQL을 생성함 조회시 JPA가 SQL을 생성하여 SQL을 생성 패러다임 불일치 해결 장점 개발이 편리함 : 기본적인CRUD용 SQL을 직접 작성하지 않아도 됨 데이터베이스에 독립적 개발 가능 : JPA는 데이터베이스에 종속적이지 않아서 데이터베이스가 변경되더라도 JPA가 해당 데이터베이스에 맞는 쿼리 알아서 생성해줌 유지보수가 쉬움: 테이블 변경시 JPA의 엔티티만 수정하면 됨 단점 학습이 어려움 특정 데이터베이스의 함수를 사용하지 못함 테이블을 객체지향 설계가 필요 Hibernate (하이버네이트) 2001 년 Gavin King이 만든 오픈 소스 영구 프레임 워크 데이터베이스와 상호 작용하는 Java 애플리케이션의 개발을 단순화하는 Java 프레임 워크 오픈 소스, 경량의 ORM (Object Relational Mapping) 도구 데이터 지속성을 위해 JPA (Java Persistence API) 사양을 구현(JPA 구현 중 하나 ) 자바 객체와 데이터베이스 테이블사이의 매핑을 관리하려고 만들어진 도구 ORM 개체들의 도메인 객체가 있어야 하는데 단순한 POJO이고 각 객체는 데이터테이블과 간단하게 연결 JDBC의 한계를 극복하는 데 사용 org.hibernate 패키지에 정의 됨 동작방법 Java Application내 Hibernate의 Configuration 파일(Hibernate.Properties)과 Hibernate XML Mapping 파일을 사용하여 데이터베이스에 대한 특정 작업을 수행하는 지속성 논리를 작성하여 특정 클래스의 객체(영속성 객체)를 만듦 Hibernate Framework 내부의 SessionFactory, Session , Transaction 등과 같은 많은 객체를 사용하여 Java Application과 상호작용 JDBC (Java Database Connectivity), JTA (Java Transaction API) 및 JNDI (Java Naming Directory Interface)와 같은 기존 Java API를 통해서 데이터베이스로 이동하여 지속성 논리를 수행하는 상호작용 데이터베이스와 상호작용 (CRUD 지속성 논리를 수행) 장점 오픈 소스 및 경량 : LGPL 라이선스하에 오픈 소스이며 경량임 빠른 성능 : 최대 절전 프레임 워크에서 캐시가 내부적으로 사용되기 때문에 최대 절전 프레임 워크의 성능이 빠름 데이터베이스 독립 쿼리 : HQL (Hibernate Query Language)은 SQL의 객체 지향 버전데이터베이스 독립적 인 쿼리를 생성 > 특정 쿼리를 작성할 필요가 없음 자동 테이블 생성 : Hibernate 프레임 워크는 데이터베이스 테이블을 자동으로 생성하는 기능을 제공 > 데이터베이스에 수동으로 테이블을 만들 필요가 없음 복잡한 조인 단순화 : 하이버 네이트 프레임 워크에서는 여러 테이블에서 데이터를 가져 오는 것이 쉬움 쿼리 통계 및 데이터베이스 상태 제공 : Hibernate는 쿼리 캐시를 지원하고 쿼리 및 데이터베이스 상태에 대한 통계를 제공 MyBatis 오픈 소스, 경량의 지속성 프레임 워크 가장 간단한 지속성 프레임 워크 iBatis iBatis는 SQL에 기반한 데이터베이스와 자바, 닷넷(.NET), 루비(Ruby) 등을 연결시켜 주는 역할을 하는 영속성 프레임워크(Persistence Framework) 연결은 프로그램의 소스코드에서 SQL 문장을 분리하여 별도의 XML 파일로 저장하고 이 둘을 서로 연결시켜주는 방식으로 작동 iBatis는 사용자가 SQL 문장을 만들면 그에 적합한 객체모델을 생성하는 방식으로 작동 모든 SQL을 XML로 작성하고 SQL문을 사용하는 DAO클래스를 설계해서 SQL호출하는 방식 팀 전원이 아파치 소프트웨어 재단에서 구글 코드로 이전하면서 중단됨 새로운 프레임워크 MyBatis로 변경 장점 인터페이스와 애노테이션을 통해서 SQL문 설정하고 처리할 수 있음 XML만을 이용해서 SQL문을 설정  DAO에서는 xml찾아서 실행하는 코드 작성하는 방식  SQL수정 유지보수적합하나 복잡성 증가 동적 Query 지원 ORM 지원 결론 MyBatis Hibernate SQL을 생성하고 싶을 경우 SQL 을 생성하고 싶지않을 경우 데이터베이스에 따라 달라질 수 있는 SQL을 사용 데이터베이스와 독립적인 HQL을 사용 ResultSet을 POJO 객체에 매핑하므로 테이블 구조에 대해 신경 쓸 필요 없움 Java POJO 객체를 데이터베이스 테이블에 매핑 references https://practice.geeksforgeeks.org/problems/what-is-orm https://www.javatpoint.com/hibernate-tutorial https://www.geeksforgeeks.org/introduction-to-hibernate-framework/ https://www.tutorialspoint.com/hibernate/orm_overview.htm https://www.geeksforgeeks.org/difference-between-jdbc-and-hibernate-in-java/ https://www.javatpoint.com/jpa-vs-hibernate https://www.tutorialspoint.com/mybatis/mybatis_overview.htm]]>[Spring] Spring VS Spring boot VS Spring MVC 개념 및 차이점2021-05-24T00:10:00+09:002021-05-24T00:10:00+09:00https://devvoon.github.io//spring-springboot<![CDATA[

요즘 spring boot가 스프링진영에서 제일 많이 쓰인다고 한다.
듣기만 했지 이것 또한 실무에서 만나본 적이 없다. (생각보다 한 번 개발된 서비스는 쉽게 변하지 않는다.)
최근에 개인 프로젝트를 진행하면서 사용하고 있는데 셋팅도 쉽고 여러모로 스프링 보다 편한부분이 많다.
앞으로는 더 많이 쓰일 것 같다고 하니 잘 익혀두고 알아두면 좋을 스프링 부트

Spring VS Spring boot VS Spring MVC 개념 및 차이점

Spring

  • 오픈 소스 경량 프레임 워크
  • 자바 개발자가 간단하고 안정적이며 확장 가능한 엔터프라이즈 애플리케이션을 빌드 할 수 있도록 함
  • 비즈니스 개체를 관리하는 데 도움이되는 다양한 방법을 제공하는 데 중점을 둠
  • Java 데이터베이스 연결 (JDBC), JavaServer Pages (JSP) 및 Java Servlet과 같은 기존 Java 프레임 워크 및 API (Application Programming Interface)에 비해 웹 애플리케이션 개발이 훨씬 쉬워짐
  • AOP (Aspect-Oriented Programming), POJO (Plain Old Java Object) 및 DI (dependency injection)와 같은 다양한 새로운 기술을 사용하여 엔터프라이즈 애플리케이션을 개발
    • 스프링 AOP 같은 서브 프레임 워크라고도 층의 집합
  • Spring 개체 관계형 매핑 (Spring ORM). Spring Web Flow 및 Spring Web MVC 등이 있음
    • 웹 응용 프로그램을 구성하는 동안 이러한 모듈을 별도로 사용 가능
    • 모듈은 웹 응용 프로그램에서 더 나은 기능을 제공하기 위해 함께 그룹화 가능

Spring MVC

  • Spring은 확장 가능한 애플리케이션을 만드는 데 널리 사용 되는 Spring MVC 프레임 워크를 제공
  • Spring MVC 프레임 워크는 Model View, Controller라는 모듈의 분리를 가능하게하고 애플리케이션 통합을 원활하게 처리
  • 개발자는 일반 Java 클래스를 사용하여 복잡한 응용 프로그램을 만들 수 있음
  • 모델 객체는 맵을 사용하여 뷰와 컨트롤러간에 전달

Spring Boot

  • Spring Boot는 기존의 스프링 프레임 워크 위에 구축 (스프링 프레임 워크 기반)
  • 스프링의 모든 기능을 제공하면서도 스프링보다 사용하기 쉬움
  • Spring Boot는 마이크로 서비스 기반 프레임 워크이며 매우 짧은 시간에 프로덕션 준비 애플리케이션을 만듦
  • Spring Boot에서는 모든 것이 자동으로 구성됨
  • 특정 기능을 활용하기 위해 적절한 구성을 사용하기 만
  • Spring Boot는 REST API를 개발하려는 경우 매우 유용
  • Spring Boot는 프로젝트를 war 또는 jar 파일로 변환하는 기능을 제공
  • Tomcat의 인스턴스는 클라우드에서도 실행 가능
  • 자주 사용하는 라이브러리가 미리 조합되어있음
  • 복잡한 설정이 자동 처리됨
  • 내장서버를 포함 (톰캣) 서버를 추가로 설치하지 않아도 바로 개발 가능
  • 톰캣, 제티와 같은 WAS에 배포하지 않고도 실행할 수 있는 jar 파일로 웹어플리케이션 개발 가능

Spring boot의 4계층

  • Presentation Layer : 이름에서 알 수 있듯이 view (예 : front-end 부분)로 구성
  • Data Access Layer : 데이터베이스에 대한 CRUD (create, retrieve, update, delete)
  • Service Layer : 서비스 클래스로 구성되며 데이터 액세스 계층에서 제공하는 서비스를 사용
  • Integration Layer : 웹별 웹 서비스 (인터넷을 통해 사용 가능한 모든 서비스 및 XML 메시징 시스템 사용)로 구성
spring spring boot spring MVC
엔터프라이즈 애플리케이션을 개발하는 오픈 소스 경량 프레임 워크 REST API를 개발하는 데 널리 사용되는 기존의 스프링 프레임 워크 위에 빌드 Model View이며 웹 애플리케이션 개발에 널리 사용되는 Controller 기반 웹 프레임 워크
의존성 주입 자동 구성 수동으로 빌드
명시 적으로 서버를 설정 Tomcat 및 Jetty 등과 같은 임베디드 서버를 제공  
실행 시 배치 디스크립터가 필요 배치 디스크립터에 대한 요구 사항은 없음 배치 디스크립터가 필요
개발자는 많은 코드를 작성 코드 줄일 수 있음 , 개발 시간을 줄이고 생산성을 높임 개발에 더 많은 시간이 걸림
메모리 내 데이터베이스에 대한 지원을 제공하지 않음 H2와 같은 메모리 내 데이터베이스에 대한 지원을 제공  
  Presentation Layer, Data Access Layer, Service Layer, Integration Layer Model, View, Controller, Front Controller

추가로 spring이전의 엔터프라이즈 프레임워크인 EJB에 대한 개념을 알아보겠다.
아직도 오래된 프로젝트, 공공기관에서 간혹가다 만날 수 있으며, 나도 잠깐 만난적이 있다.

EJB (Enterprise Java Beans)

  • 엔터프라이즈 자바빈즈(Enterprise JavaBeans; EJB)는 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델
  • 이제까지는 상속받으면 부모가 내꺼되고 해서 상속을 받고받고 하면 내가 없어짐 내가 상속으로 이미 결정됨 (EJB)
  • 즉, EJB는 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션
  • EJB 사양은 Java EE의 자바 API 중 하나로, 주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리하는 역할
  • 애플리케이션의 비즈니스 로직을 요약하는 서버 측 소프트웨어 구성 요소
  • EJB 컨테이너는 컴퓨터 안정성, JSL (Java Servlet Lifecycle) 관리, 트랜잭션 절차 및 기타 웹 서비스를 포함한 웹 관련 소프트웨어 요소에 대한 런타임 환경을 제공
  • EJB 응용 프로그램을 실행하려면 Jboss, Glassfish, Weblogic, Websphere 등과 같은 응용 프로그램 서버가 필요
    • Life Cycle Management, Object Pooling, Transaction Processing, Security 등을 수행

EJB 세 가지 유형

Session Bean

  • 세션 빈은 로컬, 원격 또는 웹 서비스 클라이언트에 의해 호출 될 수있는 비즈니스 로직을 포함
  • Stateful 세션 빈 및
  • Stateless 세션 빈

Message Driven Bean

  • Session Bean과 마찬가지로 비즈니스 로직을 포함하고 있지만 메시지를 전달하여 호출

Entity Bean

  • 데이터베이스에서 지속될 수있는 상태를 요약
  • Bean Managed Persistence
  • 컨테이너 관리 지속성

특징

  • Java EE의 사양
  • EJB 데이터 소스, JMS 리소스 및 JPA 리소스를 포함하여 컨테이너에 모든 것을 삽입 가능

references

https://www.geeksforgeeks.org/difference-between-spring-and-spring-boot/?ref=rp
https://www.geeksforgeeks.org/difference-between-spring-mvc-and-spring-boot/?ref=rp
https://www.geeksforgeeks.org/difference-between-ejb-and-spring/?ref=rp

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[요즘 spring boot가 스프링진영에서 제일 많이 쓰인다고 한다. 듣기만 했지 이것 또한 실무에서 만나본 적이 없다. (생각보다 한 번 개발된 서비스는 쉽게 변하지 않는다.) 최근에 개인 프로젝트를 진행하면서 사용하고 있는데 셋팅도 쉽고 여러모로 스프링 보다 편한부분이 많다. 앞으로는 더 많이 쓰일 것 같다고 하니 잘 익혀두고 알아두면 좋을 스프링 부트 Spring VS Spring boot VS Spring MVC 개념 및 차이점 Spring 오픈 소스 경량 프레임 워크 자바 개발자가 간단하고 안정적이며 확장 가능한 엔터프라이즈 애플리케이션을 빌드 할 수 있도록 함 비즈니스 개체를 관리하는 데 도움이되는 다양한 방법을 제공하는 데 중점을 둠 Java 데이터베이스 연결 (JDBC), JavaServer Pages (JSP) 및 Java Servlet과 같은 기존 Java 프레임 워크 및 API (Application Programming Interface)에 비해 웹 애플리케이션 개발이 훨씬 쉬워짐 AOP (Aspect-Oriented Programming), POJO (Plain Old Java Object) 및 DI (dependency injection)와 같은 다양한 새로운 기술을 사용하여 엔터프라이즈 애플리케이션을 개발 스프링 AOP 같은 서브 프레임 워크라고도 층의 집합 Spring 개체 관계형 매핑 (Spring ORM). Spring Web Flow 및 Spring Web MVC 등이 있음 웹 응용 프로그램을 구성하는 동안 이러한 모듈을 별도로 사용 가능 모듈은 웹 응용 프로그램에서 더 나은 기능을 제공하기 위해 함께 그룹화 가능 Spring MVC Spring은 확장 가능한 애플리케이션을 만드는 데 널리 사용 되는 Spring MVC 프레임 워크를 제공 Spring MVC 프레임 워크는 Model View, Controller라는 모듈의 분리를 가능하게하고 애플리케이션 통합을 원활하게 처리 개발자는 일반 Java 클래스를 사용하여 복잡한 응용 프로그램을 만들 수 있음 모델 객체는 맵을 사용하여 뷰와 컨트롤러간에 전달 Spring Boot Spring Boot는 기존의 스프링 프레임 워크 위에 구축 (스프링 프레임 워크 기반) 스프링의 모든 기능을 제공하면서도 스프링보다 사용하기 쉬움 Spring Boot는 마이크로 서비스 기반 프레임 워크이며 매우 짧은 시간에 프로덕션 준비 애플리케이션을 만듦 Spring Boot에서는 모든 것이 자동으로 구성됨 특정 기능을 활용하기 위해 적절한 구성을 사용하기 만 Spring Boot는 REST API를 개발하려는 경우 매우 유용 Spring Boot는 프로젝트를 war 또는 jar 파일로 변환하는 기능을 제공 Tomcat의 인스턴스는 클라우드에서도 실행 가능 자주 사용하는 라이브러리가 미리 조합되어있음 복잡한 설정이 자동 처리됨 내장서버를 포함 (톰캣) 서버를 추가로 설치하지 않아도 바로 개발 가능 톰캣, 제티와 같은 WAS에 배포하지 않고도 실행할 수 있는 jar 파일로 웹어플리케이션 개발 가능 Spring boot의 4계층 Presentation Layer : 이름에서 알 수 있듯이 view (예 : front-end 부분)로 구성 Data Access Layer : 데이터베이스에 대한 CRUD (create, retrieve, update, delete) Service Layer : 서비스 클래스로 구성되며 데이터 액세스 계층에서 제공하는 서비스를 사용 Integration Layer : 웹별 웹 서비스 (인터넷을 통해 사용 가능한 모든 서비스 및 XML 메시징 시스템 사용)로 구성 spring spring boot spring MVC 엔터프라이즈 애플리케이션을 개발하는 오픈 소스 경량 프레임 워크 REST API를 개발하는 데 널리 사용되는 기존의 스프링 프레임 워크 위에 빌드 Model View이며 웹 애플리케이션 개발에 널리 사용되는 Controller 기반 웹 프레임 워크 의존성 주입 자동 구성 수동으로 빌드 명시 적으로 서버를 설정 Tomcat 및 Jetty 등과 같은 임베디드 서버를 제공   실행 시 배치 디스크립터가 필요 배치 디스크립터에 대한 요구 사항은 없음 배치 디스크립터가 필요 개발자는 많은 코드를 작성 코드 줄일 수 있음 , 개발 시간을 줄이고 생산성을 높임 개발에 더 많은 시간이 걸림 메모리 내 데이터베이스에 대한 지원을 제공하지 않음 H2와 같은 메모리 내 데이터베이스에 대한 지원을 제공     Presentation Layer, Data Access Layer, Service Layer, Integration Layer Model, View, Controller, Front Controller 추가로 spring이전의 엔터프라이즈 프레임워크인 EJB에 대한 개념을 알아보겠다. 아직도 오래된 프로젝트, 공공기관에서 간혹가다 만날 수 있으며, 나도 잠깐 만난적이 있다. EJB (Enterprise Java Beans) 엔터프라이즈 자바빈즈(Enterprise JavaBeans; EJB)는 기업환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델 이제까지는 상속받으면 부모가 내꺼되고 해서 상속을 받고받고 하면 내가 없어짐 내가 상속으로 이미 결정됨 (EJB) 즉, EJB는 애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션 EJB 사양은 Java EE의 자바 API 중 하나로, 주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리하는 역할 애플리케이션의 비즈니스 로직을 요약하는 서버 측 소프트웨어 구성 요소 EJB 컨테이너는 컴퓨터 안정성, JSL (Java Servlet Lifecycle) 관리, 트랜잭션 절차 및 기타 웹 서비스를 포함한 웹 관련 소프트웨어 요소에 대한 런타임 환경을 제공 EJB 응용 프로그램을 실행하려면 Jboss, Glassfish, Weblogic, Websphere 등과 같은 응용 프로그램 서버가 필요 Life Cycle Management, Object Pooling, Transaction Processing, Security 등을 수행 EJB 세 가지 유형 Session Bean 세션 빈은 로컬, 원격 또는 웹 서비스 클라이언트에 의해 호출 될 수있는 비즈니스 로직을 포함 Stateful 세션 빈 및 Stateless 세션 빈 Message Driven Bean Session Bean과 마찬가지로 비즈니스 로직을 포함하고 있지만 메시지를 전달하여 호출 Entity Bean 데이터베이스에서 지속될 수있는 상태를 요약 Bean Managed Persistence 컨테이너 관리 지속성 특징 Java EE의 사양 EJB 데이터 소스, JMS 리소스 및 JPA 리소스를 포함하여 컨테이너에 모든 것을 삽입 가능 references https://www.geeksforgeeks.org/difference-between-spring-and-spring-boot/?ref=rp https://www.geeksforgeeks.org/difference-between-spring-mvc-and-spring-boot/?ref=rp https://www.geeksforgeeks.org/difference-between-ejb-and-spring/?ref=rp]]>
[Spring] Maven VS Gradle 개념, 비교2021-05-20T22:35:00+09:002021-05-20T22:35:00+09:00https://devvoon.github.io//spring-maven-vs-gradle<![CDATA[

빌드 자동화 도구로 maven 과 gradle 대표적인다.
오랫동안 maven이 대세였다면 최근 몇년간 gradle로 추세가 변하고 있다고 한다.
그러나 난 아직도 실무에서 써본적이 없다. 그래서 최근에 개인 프로젝트를 진행하면서 gradle을 써보았는데, 복잡한 maven과 달리 생각이상으로 편하다.
환경설정이 헤매지 않고 이리도 쉬운거였다니..?
build.gradle에 작성하는데, 이게 매우 쉽고 편하다보니 pom.xml을 작성할 생각하면 머리가 아플 지경이다.
실무환경도 어서 한번 gradle을 만나보고 싶다.

Maven VS Gradle

Maven

  • maven 프로젝트 빌드/관리를 위한 모듈
  • maven은 자바 빌드 도구로서 Apache Ant를 대안으로 나옴
  • 프로젝트 객체 모델(POM)의 개념을 기반으로 Maven은 중앙 정보에서 프로젝트의 빌드,보고 및 문서를 관리

특징 

  • 빌드도구(자원을 하나로 합치는데 집둘하는 애플리케이션) /ant(앤트)도 있음
  • 컴파일,테스트,배포를 쉽게 해줌
  • WAR나 JAR파일로 실행가능한 상태로 배포
  • 복잡한 app이라면 Maven이나 Ant같은 빌드도구를 이용해 짧은 시간에 빌드를 만들면 됨
  • 특히 maven은 규칙만 따르면 됨
  • 앤트는 maven과 같은 규칙(디렉터리 구조등)은 없어서 유연하다는 장점이 있지만 표준화 되지않기 때문에 관리 해야 함
  • 의존성 관리 용이
  • 기본 규약 제공
  • 유용한 여러 플러그인 
  • maven 소프트웨어 도구는 자바 프로젝트를 위해 이러한 디렉터리 구조를 자동으로 생성
  • C#, Ruby, Scala 등과 같은 다른 프로그래밍 프로젝트에도 사용

Gradle

  • 오픈 소스 빌드 자동화 도구

특징

  • 구조화 된 build프레임워크 (구조의 전환이 가능)
  • Maven, Ivy등의 기존 저장소 인프라 또는 pom.xml 파일과 ivy.xml 파일에 대한 migration의 편이성 제공
  • 멀티 프로젝트 빌드 지원
  • 의존성 관리의 다양한 방법 제공
  • Build script를 xml이 아닌 Groovy 기반의 DSL(Domain Specific Language)1을 사용
  • 기존 Build를 구성하기 위한 풍부한 도메인 모델 제공
  • Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드 지원
  • xml의 구조적인 틀을 벗어나 코딩에 의한 간결한 정의가 가능
  • build.gradle 파일에 빌드정보를 정의하여 프로젝트에서 사용하는 환경 설정, 빌드방법, 라이브러리 정보 등을 기술함으로서 빌드 및 프로젝트의 관리환경을 구성
  • Google은 Android 용 공식 빌드 도구로 Gradle을 선택
  • Java, Scala, Android, C / C ++ 및 Groovy를 포함한 많은 언어 및 플랫폼에서 빌딩 자동화

Gradle VS Maven

Gradle Maven
Groovy 기반 DSL (도메인 특정 언어)을 사용하는 빌드 자동화 시스템 주로 자바 프로젝트에 사용되는 소프트웨어 프로젝트 관리 시스템
프로젝트 구성을 선언하는데 XML 파일을 사용안함 프로젝트, 종속성, 빌드 순서 및 필수 플러그인을 선언하기 위해 XML 파일을 사용
작업을 수행하는 작업 종속성의 그래프를 기반 고정 및 선형 모델의 단계를 기반
주요 목표는 프로젝트에 기능을 추가하는 것 주요 목표는 프로젝트 단계와 관련
입력 및 출력 작업을 추적하여 작업을 피하고 변경된 작업 만 실행, 더 빠른 성능을 제공 빌드 캐시를 사용하지 않아 빌드 시간이 Gradle보다 느림
고도로 사용자 정의 > 광범위한 IDE 지원 사용자 지정 빌드를 제공 제한된 수의 매개 변수와 요구 사항이 있으므로 사용자 정의는 약간 복잡
Java 컴파일을 방지 컴파일이 필수

references

https://maven.apache.org/what-is-maven.html
https://docs.gradle.org/current/userguide/what_is_gradle.html
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev3.6:dep:build_tool:gradle
https://gradle.org/maven-vs-gradle/
https://ko.wikipedia.org/wiki/IBATIS
https://ko.wikipedia.org/wiki/%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4
https://www.slideshare.net/jafarnesargi/java-bean
https://ko.wikipedia.org/wiki/%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88_%EC%9E%90%EB%B0%94%EB%B9%88%EC%A6%88
https://www.javatpoint.com/gradle-vs-maven


주석

  1. 특정한 도메인을 적용하는데 특화된 컴퓨터 언어 ↩

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[빌드 자동화 도구로 maven 과 gradle 대표적인다. 오랫동안 maven이 대세였다면 최근 몇년간 gradle로 추세가 변하고 있다고 한다. 그러나 난 아직도 실무에서 써본적이 없다. 그래서 최근에 개인 프로젝트를 진행하면서 gradle을 써보았는데, 복잡한 maven과 달리 생각이상으로 편하다. 환경설정이 헤매지 않고 이리도 쉬운거였다니..? build.gradle에 작성하는데, 이게 매우 쉽고 편하다보니 pom.xml을 작성할 생각하면 머리가 아플 지경이다. 실무환경도 어서 한번 gradle을 만나보고 싶다. Maven VS Gradle Maven maven 프로젝트 빌드/관리를 위한 모듈 maven은 자바 빌드 도구로서 Apache Ant를 대안으로 나옴 프로젝트 객체 모델(POM)의 개념을 기반으로 Maven은 중앙 정보에서 프로젝트의 빌드,보고 및 문서를 관리 특징  빌드도구(자원을 하나로 합치는데 집둘하는 애플리케이션) /ant(앤트)도 있음 컴파일,테스트,배포를 쉽게 해줌 WAR나 JAR파일로 실행가능한 상태로 배포 복잡한 app이라면 Maven이나 Ant같은 빌드도구를 이용해 짧은 시간에 빌드를 만들면 됨 특히 maven은 규칙만 따르면 됨 앤트는 maven과 같은 규칙(디렉터리 구조등)은 없어서 유연하다는 장점이 있지만 표준화 되지않기 때문에 관리 해야 함 의존성 관리 용이 기본 규약 제공 유용한 여러 플러그인  maven 소프트웨어 도구는 자바 프로젝트를 위해 이러한 디렉터리 구조를 자동으로 생성 C#, Ruby, Scala 등과 같은 다른 프로그래밍 프로젝트에도 사용 Gradle 오픈 소스 빌드 자동화 도구 특징 구조화 된 build프레임워크 (구조의 전환이 가능) Maven, Ivy등의 기존 저장소 인프라 또는 pom.xml 파일과 ivy.xml 파일에 대한 migration의 편이성 제공 멀티 프로젝트 빌드 지원 의존성 관리의 다양한 방법 제공 Build script를 xml이 아닌 Groovy 기반의 DSL(Domain Specific Language)1을 사용 기존 Build를 구성하기 위한 풍부한 도메인 모델 제공 Gradle 설치 없이 Gradle Wrapper를 이용하여 빌드 지원 xml의 구조적인 틀을 벗어나 코딩에 의한 간결한 정의가 가능 build.gradle 파일에 빌드정보를 정의하여 프로젝트에서 사용하는 환경 설정, 빌드방법, 라이브러리 정보 등을 기술함으로서 빌드 및 프로젝트의 관리환경을 구성 Google은 Android 용 공식 빌드 도구로 Gradle을 선택 Java, Scala, Android, C / C ++ 및 Groovy를 포함한 많은 언어 및 플랫폼에서 빌딩 자동화 Gradle VS Maven Gradle Maven Groovy 기반 DSL (도메인 특정 언어)을 사용하는 빌드 자동화 시스템 주로 자바 프로젝트에 사용되는 소프트웨어 프로젝트 관리 시스템 프로젝트 구성을 선언하는데 XML 파일을 사용안함 프로젝트, 종속성, 빌드 순서 및 필수 플러그인을 선언하기 위해 XML 파일을 사용 작업을 수행하는 작업 종속성의 그래프를 기반 고정 및 선형 모델의 단계를 기반 주요 목표는 프로젝트에 기능을 추가하는 것 주요 목표는 프로젝트 단계와 관련 입력 및 출력 작업을 추적하여 작업을 피하고 변경된 작업 만 실행, 더 빠른 성능을 제공 빌드 캐시를 사용하지 않아 빌드 시간이 Gradle보다 느림 고도로 사용자 정의 > 광범위한 IDE 지원 사용자 지정 빌드를 제공 제한된 수의 매개 변수와 요구 사항이 있으므로 사용자 정의는 약간 복잡 Java 컴파일을 방지 컴파일이 필수 references https://maven.apache.org/what-is-maven.html https://docs.gradle.org/current/userguide/what_is_gradle.html https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev3.6:dep:build_tool:gradle https://gradle.org/maven-vs-gradle/ https://ko.wikipedia.org/wiki/IBATIS https://ko.wikipedia.org/wiki/%EB%A7%88%EC%9D%B4%EB%B0%94%ED%8B%B0%EC%8A%A4 https://www.slideshare.net/jafarnesargi/java-bean https://ko.wikipedia.org/wiki/%EC%97%94%ED%84%B0%ED%94%84%EB%9D%BC%EC%9D%B4%EC%A6%88_%EC%9E%90%EB%B0%94%EB%B9%88%EC%A6%88 https://www.javatpoint.com/gradle-vs-maven 주석 특정한 도메인을 적용하는데 특화된 컴퓨터 언어 ↩]]>
[Spring] Spring MVC2021-04-30T22:22:00+09:002021-04-30T22:22:00+09:00https://devvoon.github.io//spring-srping-mvc<![CDATA[
  • Spring MVC는 웹 애플리케이션을 빌드하는 데 사용되는 Java 프레임 워크
  • MVC 디자인 패턴
  • Inversion of Control, Dependency Injection과 같은 핵심 스프링 프레임 워크의 모든 기본 기능을 구현
  • DispatcherServlet의 도움으로 Spring 프레임 워크에서 MVC를 사용하는 우아한 솔루션을 제공
    • DispatcherServlet은 들어오는 요청을 수신하여 컨트롤러, 모델 및 뷰와 같은 올바른 리소스에 매핑하는 클래스

Model-View-Controller

Model

  • 모델에는 애플리케이션의 데이터가 포함됨
  • 데이터는 단일 개체 또는 개체 모음

Controller

  • 컨트롤러에는 애플리케이션의 비즈니스 로직이 포함
  • @Controller 주석은 클래스를 컨트롤러로 표시하는 데 사용됨

View

  • 보기는 제공된 정보를 특정 형식으로 나타냄
  • 일반적으로 JSP + JSTL은보기 페이지를 만드는 데 사용됨
  • Spring은 Apache Velocity, Thymeleaf 및 FreeMarker와 같은 다른 뷰 기술도 지원

FrontController

  • Spring Web MVC에서 DispatcherServlet 클래스는 프론트 컨트롤러로 작동
  • Spring MVC 애플리케이션의 흐름을 관리

spring_mvc

Spring MVC 흐름

Dispather Servlet

  • 모든 요청이 프론트 컨트롤러로 작동하는 DispatcherServlet에 전달 받음

HandlerMapping

  • 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정
  • HandlerAdapter : 각 타입의 컨트롤러 구현체를 알맞게 호출하기 위해 사용

Controller

  • 클라이언트의 요청을 처리한 뒤 ModelAndView의 개체를 반환

ModelAndView

  • Controller가 처리한 결과 정보 및 뷰선택에 필요한 정보를 담음

ViewResolver

  • 컨트롤러의 처리 결과를 생성할 뷰를 결정

View

  • 컨트롤러의 처리 결과를 화면에 생성
  • JSP, Velocity, Thymeleaf 템플릿을 뷰로 사용

spring_flow-of-spring-web-mvc

  1. 처리 요청 URL전달 받음
  2. 요청 URL와 매핑되는 Controller 검색
  3. 처리요청
  4. ModelAndView 리턴
  5. Controller의 실행 결과를 보여줄 View 검색
  6. 응답 출력 요청

특징

  • 분리 된 역할 : Spring MVC는 모델 객체, 컨트롤러, 명령 객체, 뷰 리졸버, DispatcherServlet, 유효성 검사기 등이 특수 객체에 의해 수행 될 수있는 각 역할을 분리
  • 경량 : 경량 서블릿 컨테이너를 사용하여 애플리케이션을 개발, 배포
  • 강력한 구성 : 웹 컨트롤러에서 비즈니스 개체 및 유효성 검사기까지 컨텍스트 전반에 걸쳐 쉽게 참조 할 수있는 프레임 워크 및 애플리케이션 클래스 모두에 대한 강력한 구성을 제공
  • 신속한 개발 : Spring MVC는 빠르고 병렬적인 개발을 용이하게 함
  • 재사용 가능한 비즈니스 코드 : 새 개체를 만드는 대신 기존 비즈니스 개체를 사용 가능
  • 쉬운 테스트 : Spring에서는 일반적으로 setter 메서드를 사용하여 테스트 데이터를 주입 할 수있는 JavaBeans 클래스를 만듦
  • 유연한 매핑 : 페이지를 쉽게 리디렉션하는 특정 주석을 제공

구성

구조

pom.xml 파일에 프로젝트 정보 및 구성을 제공

  • Maven을 사용하는 경우 maven 종속성 추가

web.xml 파일에 컨트롤러 항목 제공

  • Spring Web MVC에서 프론트 컨트롤러 역할을하는 서블릿 클래스 DispatcherServlet을 지정
  • html 파일에 대한 모든 수신 요청은 DispatcherServlet으로 전달됨
  • 공통으로 사용할 어플리케이션 컨텍스트 설정

컨트롤러 클래스 만들기

  • 컨트롤러 클래스를 생성하기 위해 두 개의 주석 @Controller 및 @RequestMapping을 사용
  • @Controller : 클래스를 Controller로 표시함
  • @Requestmapping : 지정된 URL 이름으로 클래스를 매핑하는데 사용

spring-servlet.xml 파일에 빈 정의

  • 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에 스프링 설정파일에 컨트롤러를 빈으로 등록
  • View 구성 요소를 지정해야하는 중요한 구성 파일
  • context : component-scan 요소는 DispatcherServlet이 컨트롤러 클래스를 검색 할 기본 패키지를 정의
  • WEB-INF 디렉토리에 있어야 함

참고

  • 의존관계는 인터페이스를 통해 이루워짐
    • 구상 클래스에 대해서는 기술 할 필요가 없음 -> 객체간의 결합이 약해짐
  • Tightly coupled 
    • 구현 클래스 변경시 동작방법이 없음
    • 클래스 이름, 생성자나 호출메소드의 형태(입출력 파라미터,리턴형을)을 변경시에는 호출하는 클래스의 수정 후 재 컴파일 필요
    • 텍스트 작업부담이 증가
    • 인터페이스 사용으로 해결 
  • Loosely coupled
    • 인터페이스를 상속함으로써 인터페이스와 구현 부분을 분리해서 코딩 
    • 인터페이스 변경이 없다면 구현부분이 바뀌어도 이용하는 쪽이 받는 영향을 최소화 함 => 객체지향프로그래밍은 구현하지 않고 인터페이스를 사용하는 것을 추천
    • 코딩상 규약으로서의 기능을 하기 때문에 변경에 강한 애플리케이션을 만들 수 있음
  • 구현 클래스 변경시 동작보장됨 
    • 구현 객체 이름 변경 요구 됨 => 해결방안 : Factory Method 디자인패턴 혹은 스프링으로 해결 가능  => 인터페이스 기반 설계와 스프링을 활용하는 것으로 변경이 용이한 애플리케이션 만들 수 있음

참고

  • Spring 1.x에 있는 설정파일은 DTD(Document Type Definition, 문서 형식 정의) 기반 스키마 정의
  • Spring 2.0 이후 설정파일은 XML 스키마 기반 스키마 정의

references

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html
https://docs.spring.io/spring-framework/docs/3.0.0.RC3/spring-framework-reference/html/ch15s02.html
https://www.javaguides.net/2020/07/how-spring-mvc-works-internally.html
https://www.javatpoint.com/spring-mvc-tutorial

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[Spring MVC는 웹 애플리케이션을 빌드하는 데 사용되는 Java 프레임 워크 MVC 디자인 패턴 Inversion of Control, Dependency Injection과 같은 핵심 스프링 프레임 워크의 모든 기본 기능을 구현 DispatcherServlet의 도움으로 Spring 프레임 워크에서 MVC를 사용하는 우아한 솔루션을 제공 DispatcherServlet은 들어오는 요청을 수신하여 컨트롤러, 모델 및 뷰와 같은 올바른 리소스에 매핑하는 클래스 Model-View-Controller Model 모델에는 애플리케이션의 데이터가 포함됨 데이터는 단일 개체 또는 개체 모음 Controller 컨트롤러에는 애플리케이션의 비즈니스 로직이 포함 @Controller 주석은 클래스를 컨트롤러로 표시하는 데 사용됨 View 보기는 제공된 정보를 특정 형식으로 나타냄 일반적으로 JSP + JSTL은보기 페이지를 만드는 데 사용됨 Spring은 Apache Velocity, Thymeleaf 및 FreeMarker와 같은 다른 뷰 기술도 지원 FrontController Spring Web MVC에서 DispatcherServlet 클래스는 프론트 컨트롤러로 작동 Spring MVC 애플리케이션의 흐름을 관리 Spring MVC 흐름 Dispather Servlet 모든 요청이 프론트 컨트롤러로 작동하는 DispatcherServlet에 전달 받음 HandlerMapping 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정 HandlerAdapter : 각 타입의 컨트롤러 구현체를 알맞게 호출하기 위해 사용 Controller 클라이언트의 요청을 처리한 뒤 ModelAndView의 개체를 반환 ModelAndView Controller가 처리한 결과 정보 및 뷰선택에 필요한 정보를 담음 ViewResolver 컨트롤러의 처리 결과를 생성할 뷰를 결정 View 컨트롤러의 처리 결과를 화면에 생성 JSP, Velocity, Thymeleaf 템플릿을 뷰로 사용 처리 요청 URL전달 받음 요청 URL와 매핑되는 Controller 검색 처리요청 ModelAndView 리턴 Controller의 실행 결과를 보여줄 View 검색 응답 출력 요청 특징 분리 된 역할 : Spring MVC는 모델 객체, 컨트롤러, 명령 객체, 뷰 리졸버, DispatcherServlet, 유효성 검사기 등이 특수 객체에 의해 수행 될 수있는 각 역할을 분리 경량 : 경량 서블릿 컨테이너를 사용하여 애플리케이션을 개발, 배포 강력한 구성 : 웹 컨트롤러에서 비즈니스 개체 및 유효성 검사기까지 컨텍스트 전반에 걸쳐 쉽게 참조 할 수있는 프레임 워크 및 애플리케이션 클래스 모두에 대한 강력한 구성을 제공 신속한 개발 : Spring MVC는 빠르고 병렬적인 개발을 용이하게 함 재사용 가능한 비즈니스 코드 : 새 개체를 만드는 대신 기존 비즈니스 개체를 사용 가능 쉬운 테스트 : Spring에서는 일반적으로 setter 메서드를 사용하여 테스트 데이터를 주입 할 수있는 JavaBeans 클래스를 만듦 유연한 매핑 : 페이지를 쉽게 리디렉션하는 특정 주석을 제공 구성 구조 pom.xml 파일에 프로젝트 정보 및 구성을 제공 Maven을 사용하는 경우 maven 종속성 추가 web.xml 파일에 컨트롤러 항목 제공 Spring Web MVC에서 프론트 컨트롤러 역할을하는 서블릿 클래스 DispatcherServlet을 지정 html 파일에 대한 모든 수신 요청은 DispatcherServlet으로 전달됨 공통으로 사용할 어플리케이션 컨텍스트 설정 컨트롤러 클래스 만들기 컨트롤러 클래스를 생성하기 위해 두 개의 주석 @Controller 및 @RequestMapping을 사용 @Controller : 클래스를 Controller로 표시함 @Requestmapping : 지정된 URL 이름으로 클래스를 매핑하는데 사용 spring-servlet.xml 파일에 빈 정의 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에 스프링 설정파일에 컨트롤러를 빈으로 등록 View 구성 요소를 지정해야하는 중요한 구성 파일 context : component-scan 요소는 DispatcherServlet이 컨트롤러 클래스를 검색 할 기본 패키지를 정의 WEB-INF 디렉토리에 있어야 함 참고 의존관계는 인터페이스를 통해 이루워짐 구상 클래스에 대해서는 기술 할 필요가 없음 -> 객체간의 결합이 약해짐 Tightly coupled  구현 클래스 변경시 동작방법이 없음 클래스 이름, 생성자나 호출메소드의 형태(입출력 파라미터,리턴형을)을 변경시에는 호출하는 클래스의 수정 후 재 컴파일 필요 텍스트 작업부담이 증가 인터페이스 사용으로 해결  Loosely coupled 인터페이스를 상속함으로써 인터페이스와 구현 부분을 분리해서 코딩  인터페이스 변경이 없다면 구현부분이 바뀌어도 이용하는 쪽이 받는 영향을 최소화 함 => 객체지향프로그래밍은 구현하지 않고 인터페이스를 사용하는 것을 추천 코딩상 규약으로서의 기능을 하기 때문에 변경에 강한 애플리케이션을 만들 수 있음 구현 클래스 변경시 동작보장됨  구현 객체 이름 변경 요구 됨 => 해결방안 : Factory Method 디자인패턴 혹은 스프링으로 해결 가능  => 인터페이스 기반 설계와 스프링을 활용하는 것으로 변경이 용이한 애플리케이션 만들 수 있음 참고 Spring 1.x에 있는 설정파일은 DTD(Document Type Definition, 문서 형식 정의) 기반 스키마 정의 Spring 2.0 이후 설정파일은 XML 스키마 기반 스키마 정의 references https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html https://docs.spring.io/spring-framework/docs/3.0.0.RC3/spring-framework-reference/html/ch15s02.html https://www.javaguides.net/2020/07/how-spring-mvc-works-internally.html https://www.javatpoint.com/spring-mvc-tutorial]]>
[Spring] 스프링 모듈 구성2021-04-27T20:55:00+09:002021-04-27T20:55:00+09:00https://devvoon.github.io//spring-architecture-module-bean<![CDATA[
  • 실행에 필요한 클래스를 스프링이 준비
  • 인스턴스를 준비하는 역할은 스프링이 하기에 인스턴스 준비코드를 작성할 필요 없음
    • new를 사용해 인스턴스를 생성하거나 JNDI로 인스턴스를 취득하는 코드를 만들지 않아도 됨 =>클래스 결합이 약해져 의존관계가 약해짐
  • 변경이 용이하고, 테스트가 간편하고, 컴포넌트 재사용성이 높은 유연한 애플리케이션을 만드는것이 가능함

모듈 구성 

  • 필요할 때 필요한 모듈만 이용 할 수 있기 때문에 경량컨테이너

spring_spring-overview.png

Core Container

  • Core, Beans
    • 스프링의 핵심/기본 모듈
    • Bean 컨테이너 관련기능 제공
    • DI, IoC 제공
    • BeanFactory 구현
  • Context 
    • Beans 모듈에서 기능을 상속
    • 국제화(예 : 리소스 번들 사용)나 JAVA E 가 제공하는 JNDI, EJB, JMX등을 지원
  • Expression Language
    • 런타임에 개체 그래프를 쿼리하고 조작 할 수 있는 강력한 표현 언어를 제공
    • 목록 프로젝션 및 선택은 물론 공통 목록 집계도 지원

AOP및 Aspects

  • AOP : 구현하기 위하여 메소드 인터셉터 및 포인트 컷을 정의
  • aspects : 별도의 aspects 모듈은 AspectJ와의 통합을 제공
  • Instrumentation : 특정 애플리케이션 서버에서 사용할 클래스 계측 지원 및 클래스 로더 구현을 제공
    • spring-instrument-tomcat 모듈에는 Spring의 Tomcat 용 계측 에이전트가 포함

Messaging

  • 메시징 기반 애플리케이션의 기반 역할
  • 메시지를 메소드에 매핑하기위한 주석 세트를 포함

Data Access / Integration

  • JDBC : JDBC 추상계층 기능을 제공하는 모듈. JDBC에 의한 데이터베이스 액세스를 지원
  • ORM : Object Relational Mapping 기능 제공하는 모듈. ORM API(JPA, Hibernate, iBatis, JDO)를 지원
  • OXM : JAXB, Castor, XMLBeans, JiBX, XStream에 대한 객체/XML매핑 구현을 지원하는 추상화 계층을 제공
  • JMS : Java Messaging Service 모듈은 메시지를 생산하고 소비하는 기능을 포함(Spring Framework 4.1부터 spring-messaging모듈 과의 통합을 제공)
  • Transaction : 특수 인터페이스를 구현하는 클래스와 모든 POJO의 클래스에 대한 프로그래밍 및 선언적 트랜잭션 관리를 지원

Web

  • Websocket
  • Servlet : 웹 애플리케이션을 위한 MVC 프레임 워크 기능 제공
    • 웹 애플리케이션을위한 REST 웹 서비스의 구현
    • Spring의 MVC 프레임 워크는 도메인 모델 코드와 웹 양식 사이의 명확한 분리를 제공
    • Spring Framework의 다른 모든 기능과 통합
  • Web : 웹 애플리케이션 이용에 편리한 기능을 제공 
    • 멀티 파트 파일 업로드 기능 및 Servlet 리스너 및 웹 지향 애플리케이션 컨텍스트를 사용하는 IoC 컨테이너 초기화와 같은 기본적인 웹 지향 통합 기능을 제공
    • HTTP 클라이언트와 Spring의 원격 지원의 웹 관련 부분도 포함
  • Portlet : 포틀릿 환경 미러 서블릿 기반의 기능에 사용될 MVC 구현 제공

Test

  • JUnit , TestNG를 사용한 테스트 지원
  • mock 객체 지원

BeanFactory와 ApplicationContext

spring_beanfactory-vs-applicationcontext.jpg

BeanFactory 인터페이스

  • 의존관계 주입 컨테이너에서 핵심인 BeanFactory가 하는 역할은 Bean의 생성과 관리
  • BeanFactory는 스프링 컨테이너에 액세스하기위한 루트 인터페이스
  • Spring 컨테이너에 액세스하기 위해이 BeanFactory 인터페이스와 하위 인터페이스를 사용하여 Spring의 종속성 주입 기능을 사용
  • 기능 : 빈 인스턴스화 / 연결
  • 일반적으로 구현은 지연 로딩을 사용
    • 즉, Bean은 getBean () 메소드를 통해 직접 호출 할 때만 인스턴스화 됨

ApplicationContext 인터페이스

  • ApplicationContext는 애플리케이션에 구성 정보를 제공하기위한 스프링 애플리케이션 내의 중앙 인터페이스
  • BeanFactory 인터페이스를 구현 : ApplicationContext 는 BeanFactory 의 모든 기능과 그 이상을 포함
  • 주요 기능은 대규모 비즈니스 응용 프로그램의 생성을 지원

references

https://docs.spring.io/spring-framework/docs/3.0.x/spring-framework-reference/html/overview.html
https://docs.spring.io/spring-framework/docs/4.3.13.RELEASE/spring-framework-reference/html/overview.html
https://www.geeksforgeeks.org/introduction-to-spring-framework/
https://www.javaguides.net/2019/01/beanfactory-vs-applicationcontext-in-spring.html

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[실행에 필요한 클래스를 스프링이 준비 인스턴스를 준비하는 역할은 스프링이 하기에 인스턴스 준비코드를 작성할 필요 없음 new를 사용해 인스턴스를 생성하거나 JNDI로 인스턴스를 취득하는 코드를 만들지 않아도 됨 =>클래스 결합이 약해져 의존관계가 약해짐 변경이 용이하고, 테스트가 간편하고, 컴포넌트 재사용성이 높은 유연한 애플리케이션을 만드는것이 가능함 모듈 구성  필요할 때 필요한 모듈만 이용 할 수 있기 때문에 경량컨테이너 Core Container Core, Beans 스프링의 핵심/기본 모듈 Bean 컨테이너 관련기능 제공 DI, IoC 제공 BeanFactory 구현 Context  Beans 모듈에서 기능을 상속 국제화(예 : 리소스 번들 사용)나 JAVA E 가 제공하는 JNDI, EJB, JMX등을 지원 Expression Language 런타임에 개체 그래프를 쿼리하고 조작 할 수 있는 강력한 표현 언어를 제공 목록 프로젝션 및 선택은 물론 공통 목록 집계도 지원 AOP및 Aspects AOP : 구현하기 위하여 메소드 인터셉터 및 포인트 컷을 정의 aspects : 별도의 aspects 모듈은 AspectJ와의 통합을 제공 Instrumentation : 특정 애플리케이션 서버에서 사용할 클래스 계측 지원 및 클래스 로더 구현을 제공 spring-instrument-tomcat 모듈에는 Spring의 Tomcat 용 계측 에이전트가 포함 Messaging 메시징 기반 애플리케이션의 기반 역할 메시지를 메소드에 매핑하기위한 주석 세트를 포함 Data Access / Integration JDBC : JDBC 추상계층 기능을 제공하는 모듈. JDBC에 의한 데이터베이스 액세스를 지원 ORM : Object Relational Mapping 기능 제공하는 모듈. ORM API(JPA, Hibernate, iBatis, JDO)를 지원 OXM : JAXB, Castor, XMLBeans, JiBX, XStream에 대한 객체/XML매핑 구현을 지원하는 추상화 계층을 제공 JMS : Java Messaging Service 모듈은 메시지를 생산하고 소비하는 기능을 포함(Spring Framework 4.1부터 spring-messaging모듈 과의 통합을 제공) Transaction : 특수 인터페이스를 구현하는 클래스와 모든 POJO의 클래스에 대한 프로그래밍 및 선언적 트랜잭션 관리를 지원 Web Websocket Servlet : 웹 애플리케이션을 위한 MVC 프레임 워크 기능 제공 웹 애플리케이션을위한 REST 웹 서비스의 구현 Spring의 MVC 프레임 워크는 도메인 모델 코드와 웹 양식 사이의 명확한 분리를 제공 Spring Framework의 다른 모든 기능과 통합 Web : 웹 애플리케이션 이용에 편리한 기능을 제공  멀티 파트 파일 업로드 기능 및 Servlet 리스너 및 웹 지향 애플리케이션 컨텍스트를 사용하는 IoC 컨테이너 초기화와 같은 기본적인 웹 지향 통합 기능을 제공 HTTP 클라이언트와 Spring의 원격 지원의 웹 관련 부분도 포함 Portlet : 포틀릿 환경 미러 서블릿 기반의 기능에 사용될 MVC 구현 제공 Test JUnit , TestNG를 사용한 테스트 지원 mock 객체 지원 BeanFactory와 ApplicationContext BeanFactory 인터페이스 의존관계 주입 컨테이너에서 핵심인 BeanFactory가 하는 역할은 Bean의 생성과 관리 BeanFactory는 스프링 컨테이너에 액세스하기위한 루트 인터페이스 Spring 컨테이너에 액세스하기 위해이 BeanFactory 인터페이스와 하위 인터페이스를 사용하여 Spring의 종속성 주입 기능을 사용 기능 : 빈 인스턴스화 / 연결 일반적으로 구현은 지연 로딩을 사용 즉, Bean은 getBean () 메소드를 통해 직접 호출 할 때만 인스턴스화 됨 ApplicationContext 인터페이스 ApplicationContext는 애플리케이션에 구성 정보를 제공하기위한 스프링 애플리케이션 내의 중앙 인터페이스 BeanFactory 인터페이스를 구현 : ApplicationContext 는 BeanFactory 의 모든 기능과 그 이상을 포함 주요 기능은 대규모 비즈니스 응용 프로그램의 생성을 지원 references https://docs.spring.io/spring-framework/docs/3.0.x/spring-framework-reference/html/overview.html https://docs.spring.io/spring-framework/docs/4.3.13.RELEASE/spring-framework-reference/html/overview.html https://www.geeksforgeeks.org/introduction-to-spring-framework/ https://www.javaguides.net/2019/01/beanfactory-vs-applicationcontext-in-spring.html]]>
[Spring] Spring Framework (DI/AOP)2021-04-26T21:43:00+09:002021-04-26T21:43:00+09:00https://devvoon.github.io//spring-springframework<![CDATA[

Spring의 특징과 장점

  • 애플리케이션 프레임워크
  • 스프링은 Struts같은 웹 애플리케이션 개발용 웹프레임워크와는 달리 어떤 애플리케이션에도 적용가능
  • JEE대체하는 프레임워크
  • 경량컨테이너 <-> EJB  
    • 복잡한 절차를 요구하는 ‘EJB(Enterprise Java Beans’)에 비해 경랑 컨테이너
    • 자바객체를 담고 있고, 자바객체의 생성, 소멸과 같은 라이프 사이클 관리하며 필요한 객체를 가져와 사용 하면서 EJB기능 다수행하면서도 경량  - EJB에 대항하는 것이 바로 Spring
  • 객체를 담고있는 컨테이너를 제공: 컨테이너에 객체를 담아두고 필요할때에 컨테이너로부터 객체를 가져와서 사용
  • 트랜잭션 처리를 위한 일관된 방법을 제공 : 설정 파일을 통해 트랜잭션 관련 정보를 입력하기 때문에, 트랜잭션 구현에 상관없이 동일 한 코드를 여려 환경에서 사용할 수 있음
  • 영속성과 관련된 다양한 API지원 (영속성;DB의 특징, 즉 DB를 가져다 쓰기 위한 API 지원) : JDBC를 비롯한 myBATIS, 하이버네이트, JPA등 데이터베이스 처리를 위해 널리 사용되는 라이브러리 연동을 지원
  • 다양한 API 연동 지원 (DB뿐 아니라 보안 메일등의 API) : JMS,메일, 스케줄링 등 다양한 API를 설정파일과 어노테이션을 통해서 손쉽게 사용 가능 
  • 독립적이고 테스트 가능한 컴포넌트들 작성가능
  • POJO (Plain Old Java Objects) 작성한 후 애플리케이션 컨텍스트라는 핵심 컴포넌트를 통한 의존성 주입 (dependency injection)을 이용해 POJO를 연결
  • 핵심: DI, AOP 

DI (Dependency Injection) / IoC (Inversion of control)

DI란?

  • IoC(Inversion of Control)이라고도 함 (제어의 역전)
    • DI패턴을 지원해주는 프레임 워크(spring) 설정파일과 어노테이션을 이용하여 손쉽게 객체간의 의존 관계 설정 가능  
  • 서비스 구현 클래스내 의존 객체를 직접 생성하지 않고, 생성자에서 의존하는 객체를 전달 받음
    • spring container(스프링내부에 있는 객체(Bean)들간의 관계를 관리)가 필요한 객체를 스스로 끌어들임(밖->안 setMethod 집어 넣음)
    • 외부 라이브러리 같은 의존 관계를 코드 내부에 기술하는 것이 아니라 외부 파일을 이용해서 설정하는 방식 
    • 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요 없음
    • 불필요한 의존관계를 없애거나 줄일 수 있음
  • 테스트 수행 수월 (단위 테스트 진행)
  • 의존성 : 어떤 클래스가 자신의 임무를 다하기 위해 필요한 값이나 사용할 다른 클래스와의 관계
  • 주입 : 어떤 클래스의 인스턴스에 대해 외부로부터 ‘의존성’을 설정하는 것.
  • 의존관계 주입 컨테이너의 역할 : 
    • 어떤 클래스가 필요로 하는 값이나 인스턴스를 생성, 취득 그 클래스의 인스턴스에 대해 설정
    • 필요한 인스턴스를 생성, 취득하는 코드를 직접 만들지 않아도 됨
    • 클래스간 관계가 느슨한 결합이 되어 의존성은 약해짐 
  • 내프로그램을 바꾸지 않으면서 쉽게 내가 하는 작업을 바꿀 수 있는 작업

의존관계 주입 방법

생성자 주입

  • 생성자를 통해서 의존 관계를 주입 받는 방법
  • 생성자가 1개만 있으면 @Autowired를 생략해도 자동 주입
  • 불변, 필수 의존관계에 사용
  • 스프링에서 권장하는 방식

수정자 주입

  • setXXX() 형태의 setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법
  • 선택, 변경 가능성이 있는 의존관계에 사용

필드 주입

  • 필드에 바로 주입하는 방법

일반메서드 주입

  • 일반 메서드를 통해서 주입하는 방법
  • 한번에 여러 필드를 주입 받을 수 있음

어노테이션 기반 자동 설정

  • @Autowired : 의존관계 자동 주입 (스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입)
  • 생성자에 적용, 설정메소드에 적용, 필드에 적용, 설정파일에 적용 하여 사용
  • import org.springframework.beans.factory annotation.Autowired;

정리

  • 객체 지향 원리 적용
  • DI는 OCP(The Open-Closed Principle)
    A dependency B
    A -----> B
    
  • A의 구조는 바꾸지 못함 (A의 구조는 closed 됨)
  • A 내용은 바꾸게(open, extend) 하고 싶으면 밖에서 수정하여 주입 => DI 

AOP(Aspect-Oriented Programming: 관점지향 프로그래밍)

AOP란?

  • Aspect란 소프트웨어가 갖는 다양한 특징이나 성질
  • 공통관심사항(CCC:Cross Cutting Concern)을 구현한 모듈에 의존 관계를 갖지 않음
    • 공통관심사항 적용으로 인한 의존 관계의 복잡성과 코드 중복을 해소
    • 핵심로직을 핵심관심사항이라고 함 CC(Core Concern)
  • 횡단적 관심사의 분리
    • 일반적으로 하나의 소프트웨어는 복수모듈로 구성
    • 어떤 관심사가 이러한 복수모듈에 산재하는 것을 ‘횡단적’이라고 하는데, 횡단적 관심사의 구체적인 예로 “LOG 출력”
  • an Advanced Separation of Concern 분리된 관심사는 AOP프레임워크에 의해 관리되고, 필요에 따라 필요한 시점에 각 모듈에 삽입
  • 각 모듈에서 분리된 기능을 사용하기 위한 코드를 기술할 필요 없음
    • 모듈 개발자는 횡단적 관심사에 대해 젼혀 관여안함
    • 고도로 분리된 관심사는 객체 지향보다 한층 독립성이 강해지는 것은 물론 재사용성과 보존성이 향상
    • 코드에 손대지 않고도 새로운 기능  추가 가능
  • 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통으로 필요로 하지만 실제 모듈의 핵심은 아닌 기능들을 분리해서 각 모듈에 적용 가능
  • 공통관심사항을 구현한 Aspect 클래스를 작성하고, 설정파일을 이용하여 Aspect를 핵심 로직을 구현한 클래스에 적용

Spring 에서 AOP

  • 객체 지향에 의존 관계 주입과 AOP를 조합함으로써, 보다 유연하고 보존성인 높은 견고한 소프트웨어를 개발 가능
    • 객체지향에서는 기능과 데이터를 하나의 클래스 단위로 묶어 모듈로 부터 분리하여 재사용성과 보존성을 높임
  • 핵심로직을 구현한 클래스를 실행하기 전 후에 Aspect를 적용, spring AOP는 핵심로직 수정하지 않고 적용이 가능 함
    • CC/CCC를 따로 구현하면, Spring 돌면서 실행은 섞여서 돌아가는 것처럼 보이게 됨
  • 순수 Java로 구현
  • 현재 메소드 실행 조인 포인트만 지원

AOP 용어

  • Aspect (관점) : 여러 클래스에 걸쳐있는 관심사의 모듈화
    • Spring AOP에서 aspect는 일반 클래스 (스키마 기반 접근) 또는 주석이 달린 일반 클래스 @Aspect(@AspectJ 스타일)를 사용
  • Advice (어드바이스)
    • 관점으로서 분리되고 실행시 모듈에 위빙된 구체적인 처리
    • 언제 공통관심 기능을 핵심로직에 적용할 지를 정의
    • 메서드를 호출하기전에(언제) 트랙잭션을 시작한다(공통기능) 기능을 적용한다는 것을 정의
    • Around Advice : Joinpoint 앞과 뒤에서 실행되는 Advice
    • Before Advice :  Joinpoint 앞에서 실행되는 Advice
    • After Returning Advice : Joinpoint 메서드 호출이 정상적으로 종료된 뒤 실행되는 Advice
    • After Throwing Advice : 예외가 던져질 때 실행되는 Advice
    • Instroduction : 클래스에 인터페이스와 구현을 추가하는 특수한 Advice
  • Joinpoint (조인포인트)
    • Advice를 위빙하는 포인트(적용 가능한 지점)
    • 특정 이름을 가진 메서드 실행하는 지점
  • Pointcut (포인트컷)
    • 하나또는 복수의 joinpoint를 하나로 묶은 것
    • Jointpoint의 부분 집합으로서 실제로 Advice가 적용되는 Jointpoint나타냄
  • Advisor (어드바이저)
    • Advice와 Pointcut을 하나로 묶어 다루는 것
    • 특정 결합 지점에서 측면에 의해 취해진 조치
  • Weaving (위빙)
    • Advice를 핵심 로직 코드에 적용하는 것
    • 관심사를 다시 모듈에 삽입하는 것
    • Spring AOP는 런타임에 위빙을 수행
  • AOP 프록시 : aspect 계약을 구현하기 위해 AOP 프레임 워크에 의해 생성 된 객체

POJO (Plain Old Java Object) 

  • 보통의 Java의 객체
  • 자바코드를 이용해서 객체를 구성하는 방식을 그대로 스프링에서 사용
  • 특정한 인터페이스를 구현하거나 클래스를 상속받지 않은 객체
  • 기존에 작성한 코드 수정없이 사용 

references

https://docs.spring.io/spring-framework/docs/3.0.x/spring-framework-reference/html/overview.html
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[Spring의 특징과 장점 애플리케이션 프레임워크 스프링은 Struts같은 웹 애플리케이션 개발용 웹프레임워크와는 달리 어떤 애플리케이션에도 적용가능 JEE대체하는 프레임워크 경량컨테이너 <-> EJB   복잡한 절차를 요구하는 ‘EJB(Enterprise Java Beans’)에 비해 경랑 컨테이너 자바객체를 담고 있고, 자바객체의 생성, 소멸과 같은 라이프 사이클 관리하며 필요한 객체를 가져와 사용 하면서 EJB기능 다수행하면서도 경량  - EJB에 대항하는 것이 바로 Spring 객체를 담고있는 컨테이너를 제공: 컨테이너에 객체를 담아두고 필요할때에 컨테이너로부터 객체를 가져와서 사용 트랜잭션 처리를 위한 일관된 방법을 제공 : 설정 파일을 통해 트랜잭션 관련 정보를 입력하기 때문에, 트랜잭션 구현에 상관없이 동일 한 코드를 여려 환경에서 사용할 수 있음 영속성과 관련된 다양한 API지원 (영속성;DB의 특징, 즉 DB를 가져다 쓰기 위한 API 지원) : JDBC를 비롯한 myBATIS, 하이버네이트, JPA등 데이터베이스 처리를 위해 널리 사용되는 라이브러리 연동을 지원 다양한 API 연동 지원 (DB뿐 아니라 보안 메일등의 API) : JMS,메일, 스케줄링 등 다양한 API를 설정파일과 어노테이션을 통해서 손쉽게 사용 가능  독립적이고 테스트 가능한 컴포넌트들 작성가능 POJO (Plain Old Java Objects) 작성한 후 애플리케이션 컨텍스트라는 핵심 컴포넌트를 통한 의존성 주입 (dependency injection)을 이용해 POJO를 연결 핵심: DI, AOP ]]>
[JAVA] WebApplication - Servlet2021-04-22T22:20:00+09:002021-04-22T22:20:00+09:00https://devvoon.github.io//java-webapplication<![CDATA[

Web Application - Servlet

Web Application?

  • 네트워크와 서버를 사용하여 통신하는 모든 프로그램을 의미
  • 웹 브라우저를 사용하여 액세스하므로 브라우저를 사용자 클라이언트로 쉽게 사용가능

JAVA Web Application

  • 동적 자원 (예 : 서블릿, JavaServer 페이지, Java 클래스 및 jar) 및 정적 자원 (HTML 페이지 및 그림)의 모음
  • 웹 컨테이너 내에서 실행
  • WAR (Web ARchive) 파일로 배포 가능
    • WAR는 해당 웹 응용 프로그램의 전체 내용을 포함하는 zip 파일(자바의 JAR파일과 같은 역할)
  • 서블릿을 기반으로 인기있는 Java 웹 프레임 워크는 GWT, JavaServer Faces, Struts 및 Spring 프레임 워크
  • 콘솔애플리케이션
  • 웹 애플리케이션 : 서블릿 
  • c.f ) GUI 애플리케이션 : 스윙

JAVA Web Application 기술

Servlet

Servlet 이란 ?

  • 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램
  • 자바 플랫폼에서 컴포넌트 기반의 웹애플리케이션 개발 기술
  • 웹서버에 요청을 수신하고, 수신한 요청을 처리하고, 서버에 다시 응답하는 소프트웨어의 구성 요소 (일련의 모든 과정을 직접 개발 할 필요 없이 서블릿을 사용하면 아주 간편해짐)
  • 자바 서블릿 API는 JVM위에서 실행되는 애플리케이션을 빌드하기 위한 인터페이스 집합과 파일 정의들
  • 다양한 유형의 요청에 응답하며, 서버의 기능을 확장하고, 웹서버에서 웹 애플리케이션을 호스팅 하기 위한 웹컨테이너 처럼 작동
  • 클라이언트-서버 프로토콜을 지원 하지만 HTTP Servlet 이라고도 함

Servelt 동작

  • 서블릿 동작: 서블릿 컨테이터에 등록 후 -> 서블릿 컨테이너에 의해 init() 생성, service() 호출, destory() 소멸이 이루어짐
  • c.f) 자바독립 실행 프로그램 동작 : public static void main(String[] args)  메서드가 시작되면 프로그램 수행을 시작

Servelt 구조

JAVA-servlet-architecture

  • 사용자가 웹 서버에 HTTP 요청을 보냄
  • 서버에는 데이터베이스에서 데이터를 수집하고 응답을 생성하는 서블릿이 포함 된 웹 컨테이너가 존재
  • 서블릿에서 생성 된 응답은 HTTP 응답을 통해 클라이언트 브라우저로 전송

Servelt container

  • 서블릿 객체를 관리하고 클라이언트에게 서비스 해주는 프로그램
  • Tomcat, Jetty, JBoss 등의 오픈소스 기반
  • WebLogic, WebSphere, Zeus, JBoss의 상용 서비스

JAVA-servlet-webcontainer

  • 사용자가 웹 서버에 HTTP 요청을 보냄
  • 웹 서버는 웹 컨테이너에 요청을 전달
  • 웹 컨테이너는 요청 객체의 형태로 서블릿에 요청을 전달
  • 서블릿은 응답 객체를 빌드하고 웹 컨테이너로 다시 보냄
  • 웹 컨테이너는 응답 객체를 상응하는 HTTP 응답으로 변환하고 웹 서버로 보냄
  • 웹 서버는 HTTP 응답을 통해 클라이언트로 응답을 보냄

Servlet LifeCycle

  • init()
    • 한 번만 호출 -> 서블릿이 생성 될 때만 호출 -> 일회성 초기화에 사용
    • 일반적으로 서블릿은 사용자가 서블릿에 해당하는 URL을 처음 호출 할 때 생성되지만 서버가 처음 시작될 때 로드되어야하는 서블릿을 지정할 수도 있음
  • service()
    • 실제 작업을 수행하는 주요 메서드
    • 웹 컨테이너 (서블릿 컨테이너)는 service () 메서드를 호출하여 클라이언트에서 오는 요청을 처리
    • 서버가 서블릿에 대한 요청을 받을 때마다 웹 컨테이너는 새 스레드를 생성하고 service ()를 호출
    • 이 메소드는 HTTP 요청 유형 (GET, POST, PUT, DELETE 등)을 확인하고 doGet, doPost, doPut, doDelete 등의 메소드를 적절하게 호출
  • destroy()
    • 서블릿의 수명주기가 끝날 때 한 번만 호출
    • 이 방법은 서블릿에 데이터베이스 연결을 닫고 백그라운드 스레드를 중지하고 다른 정리 작업을 수행 할 수있는 기회를 제공
    • destroy() 메소드가 실행 된 후 서블릿 객체는 가비지 수집에 사용할 수 있는 것으로 표시

references

https://www.edureka.co/blog/java-web-application/
https://codeburst.io/understanding-java-servlet-architecture-b74f5ea64bf4
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[Web Application - Servlet]]>
[WEB] HTTP와 REST API2021-04-22T22:20:00+09:002021-04-22T22:20:00+09:00https://devvoon.github.io//web-http-restapi<![CDATA[

HTTP (HyperText Transfer Protocol)

  • W3 상에서 정보를 주고받을 수 있는 프로토콜
  • HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜

프로토콜

  • TCP (Transmission Control Protocol) 전송 제어 프로토콜
    • 연결지향 : TCP 3 way handshake (SYN - SYN/ACK - ACK)
    • 데이터 전달 보증
    • 순서 보장
    • 신뢰할 수 있는 프로토콜
    • 현재는 대부분 TCP 사용
  • UDP (User Datagram Protocol) 사용자 데이터그램 프로토콜
    • 단순
    • 서비스의 신뢰성이 낮음
    • 데이터의 도착 순서 예측 할 수 없음

특징

  • Client–server 구조
  • 무상태 프로토콜(Stateless), 비연결성
  • HTTP 메시지
  • 단순함, 확장 가능

HTTP API

GET

  • 리소스 표현 / 정보 만 검색
  • 예) HTTP GET http://www.appdomain.com/users?size=20&page=5

POST

  • 새 하위 리소스를 생성
  • 예) HTTP POST http://www.appdomain.com/users

PUT

  • 기존 리소스를 대체
  • 클라이언트가 리소스를 식별
  • 예) HTTP PUT http://www.appdomain.com/users/123

DELETE

  • 리소스를 삭제 하는 데 사용
  • 예) HTTP 삭제 http://www.appdomain.com/users/123

PATCH

  • 리소스를 부분적으로 업데이트하는 것

HTTP 메서드 속성

  • Safe Methods 안전
    • HTTP 사양에 따라 GET 및 HEAD 메서드는 리소스 표현 검색에만 사용해야하며 서버의 리소스를 업데이트 / 삭제하지 않음 => 두 가지 방법 모두 “안전한” 것으로 간주
    • POST, PUT 및 DELETE은 사용자가 안전하지 않은 작업이 요청되고 있다는 사실을 사용자가 인식하고 서버에서 리소스를 업데이트 / 삭제할 수 있으므로 신중하게 사용해야 함
  • Idempotent Methods 멱등
    • 멱 등성이라는 용어는 한 번 또는 여러 번 실행하면 동일한 결과를 생성 하는 작업
    • GET, HEAD, PUT 및 DELETE 메서드는 멱등 메서드

응답코드

  • 1XX : Informational(정보) 정보 교환
  • 2XX : Success(성공) 데이터 전송이 성공적으로 이루어졌거나, 이해되었거나, 수락되었음
  • 3XX : Redirection(방향 바꿈) 자료의 위치가 바뀌었음
  • 4XX : Client Error(클라이언트 오류) 클라이언트 측의 오류 주소를 잘못 입력하였거나 요청이 잘못 되었음
  • 5XX Server Error(서버 오류) 서버 측의 오류로 올바른 요청을 처리할 수 없음

REST API (RESTful API)

REST (REpresentational State Transfer)?

  • 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식
  • 확장 가능하고 내결함성이 있으며 쉽게 확장 가능한 시스템을 보장하는 일련의 제약 조건
    • REST 또는 RESTful API 디자인 (Representational State Transfer)은 기존 프로토콜을 활용하도록 설계되어 있음
  • REST 아키텍처 스타일에서 데이터와 기능은 리소스로 간주되며 URI (Uniform Resource Identifier)를 사용하여 액세스
  • REST 기반 시스템의 상호 작용은 인터넷의 HTTP (Hypertext Transfer Protocol)를 통해 발생

REST API

  • REST 아키텍처 스타일을 따르는 웹 서비스를 RESTful 웹서비스라고 함
  • REST API는 사용자 또는 클라이언트와 그들이 얻고자 하는 리소스 또는 웹 서비스 간의 중개자로 생각
  • 클라이언트가 요청하는 내용에 따라 XML, JSON, YAML 또는 기타 형식을 반환 할 수 있음
  • REST의 6가지 기본 원칙을 준수 할 때까지 RESTful 인터페이스를 호출 가능
  • 요청 시스템은 균일하고 미리 정의 된 규칙 집합을 사용하여 웹 리소스에 액세스하고 조작가능

REST웹 서비스를 진정한 RESTful API로 만드는 6가지 아키텍처 제약 조건

  • Client–server (클라이언트-서버)
    • 클라이언트-서버의 각 파트가 독립적으로 개선될 수 있도록 해야 함
  • Stateless (무상태)
    • 각 요청 간 클라이언트의 콘텍스트가 서버에 저장되어서는 안 됨
    • 세션 상태는 전적으로 클라이언트에 유지
  • Cacheable (캐시 가능)
    • 클라이언트는 응답을 캐싱할 수 있어야 함
  • Uniform interface (균일한 인터페이스)
    • 일관적인 인터페이스로 분리되어야 함
    • REST는 네 가지 인터페이스 제약 조건으로 정의 : 리소스 식별, 표현을 통한 자원 조작, 자기 설명 메시지, 그리고 애플리케이션 상태의 엔진으로서의 하이퍼 미디어
  • Layered system (계층형 시스템)
    • 계층 형 시스템 스타일을 사용하면 각 구성 요소가 상호 작용하는 직계 계층 너머를 볼수 없도록 구성 요소 동작을 제한하여 아키텍처를 계층 적 계층으로 구성 가능
  • Code on demand (optional) – 요청시 코드 (선택 사항)
    • REST를 사용하면 애플릿 또는 스크립트 형식으로 코드를 다운로드하고 실행하여 클라이언트 기능을 확장 시킬수 있어야 함
    • 필요한 기능의 수를 줄여 클라이언트를 단순화 함

REST! ​​= HTTP

  • 웹 자체는 HTTP에서 실행되며, RESTful API도 동일한 작업을 수행
  • REST 제약에는 전송 프로토콜로 HTTP를 필수로 사용하는 것이 없음
  • RESTful API는 현재 HTTP를 전송 계층으로 사용

직렬화 Serialization

  • 직렬화된 객치는 디스크레 기록 할 수도 있고, 네트워크가 아닌 다른 I/O인터페이스에 기록하는 과정
  • JVM이서 자바 객체를 내보내는 간단한 방법

JSON

  • JSON (JavaScript Object Notation)은 경량의 DATA-교환 형식
  • name/value 형태의 쌍으로 collection 타입
  • 자바스크립트의 유래
  • xml보다 구문이 적어 부담이 덜해 다른 언어용 라이브러리에서 많이 채택
  • XSD(XML Schema Definition)를 이용한 XML과 비슷한 직렬화 접근 방법
  • JSON을 자바에서 처리할때에는 Jackson이라는 라이브러리 사용 
  • JSON은 사람이 읽을 수 있는 접근 방법을 사용하며 다양한 언어를 통해 파싱되고 처리될 수 있음

references

https://ko.wikipedia.org/wiki/HTTP
https://restfulapi.net/
https://restcookbook.com/Miscellaneous/rest-and-http/
https://www.mulesoft.com/resources/api/what-is-rest-api-design
https://www.geeksforgeeks.org/rest-api-architectural-constraints/
https://www.json.org/json-ko.html

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[HTTP (HyperText Transfer Protocol) W3 상에서 정보를 주고받을 수 있는 프로토콜 HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜]]>
[JAVA] OOP 5대원리 : SOLID (객체 지향 설계)2021-04-05T22:30:00+09:002021-04-05T22:30:00+09:00https://devvoon.github.io//java-oop-solid<![CDATA[

OOP 5대원리 : SOLID (객체 지향 설계)

SRP (The Single Responsibility Principle)

  • 한 클래스는 하나의 책임만 가져야 한다
  • 한 클래스는 하나의 목적에 맞도록만 짜라
  • 하나의 책임원리->응집도 관력

OCP(The Open-Closed Principle)

  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다
  • 개방 폐쇠의 원리->엔티티,상속(부모 변경 지양)
  • A–>B (A를 변경하지 않고 B를 변경)
  • 객체 지향 프로그램은 이 방법을 따르는게 좋다라는 원리 

LSP (The Liskov Substitution Principle)

  • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
  • 부모의 이름으로 자식을 써라
  • 리스코프 교체원리
  • 다형성 관련(부모로 자식을 사용–>인터페이스 사용권장)

DIP(The Depend Inversion Principle)

  • 프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다”
  • 의존성 주입은 이 원칙을 따르는 방법 중 하나다
  • 의존의 대상을 추상 클래스나 인터페이스 권장

ISP (The Interface Segregation Principle)

  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
  • 인터페이스 격리 원칙
  • 필요한 메서드만 갖는 인터페이스를 구현하라
  • SRP와 유사

references

https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84) https://www.geeksforgeeks.org/solid-principle-in-programming-understand-with-real-life-examples/

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[OOP 5대원리 : SOLID (객체 지향 설계)]]>
[Problem Solving - Baekjoon] 1541 잃어버린 괄호2021-02-21T10:52:00+09:002021-02-21T10:52:00+09:00https://devvoon.github.io//algorithm-problem-solving-baekjoon-1541<![CDATA[

[Baekjoon Online Judge] 1541 잃어버린 괄호

문제

문제 보기

풀이

문제 파악

  • ”-“ 연산을 나중에 하는 것이 더 작은 숫자가 나옴
  • ”-“ 기준으로 나누어서 + 연산을 먼저 해주는 로직을 짜야함

구현

전체소스보기

  • ”-“ 기준으로 피연산자들 구하기
  • [55] [50+40] 으로 나누어짐
String[] input = br.readLine().split("\\-");
  • ”+” 기준으로 나누어서 합을 구함
int[] sum = new int[input.length]; //숫자들의 합

for (int i = 0; i < input.length; i++) {
    String[] operand = input[i].split("\\+"); //+ 기호 기준으로 피연산자들 구하기

    for (int j = 0; j < operand.length; j++) {
        sum[i] += Integer.parseInt(operand[j]) ;
    }
}
  • 마지막으로 “-“ 연산 해주기
int result = sum[0];
for (int i = 1; i < sum.length; i++) {
    result = result - sum[i];
}


references

https://www.acmicpc.net/problem/1541

]]>
{"login"=>"DawoonJeong", "email"=>"[email protected]", "display_name"=>"Dawoon Jeong", "first_name"=>"Dawoon", "last_name"=>"Jeong"}[email protected]<![CDATA[[Baekjoon Online Judge] 1541 잃어버린 괄호 문제 문제 보기 풀이 문제 파악 ”-“ 연산을 나중에 하는 것이 더 작은 숫자가 나옴 ”-“ 기준으로 나누어서 + 연산을 먼저 해주는 로직을 짜야함 구현 전체소스보기 ”-“ 기준으로 피연산자들 구하기 [55] [50+40] 으로 나누어짐 String[] input = br.readLine().split("\\-"); ”+” 기준으로 나누어서 합을 구함 int[] sum = new int[input.length]; //숫자들의 합 for (int i = 0; i < input.length; i++) { String[] operand = input[i].split("\\+"); //+ 기호 기준으로 피연산자들 구하기 for (int j = 0; j < operand.length; j++) { sum[i] += Integer.parseInt(operand[j]) ; } } 마지막으로 “-“ 연산 해주기 int result = sum[0]; for (int i = 1; i < sum.length; i++) { result = result - sum[i]; } references https://www.acmicpc.net/problem/1541]]>