항해 4주차

5757 단어 항해항해

Springboot를 사용하여 게시판을 만들어보았다. CRUD 기능을 다루는 건 간단해 하고 접근했지만... 생각보다 생각해야 할 것들이 많았다.

배운점

MVC 패턴에서 Model과 Veiw를 연결하는 thymeleaf 문법부터 시작해서 DB를 연결하기 그리고 결과를 TEST하는 과정들은 모두 새로운 배움의 연속이었다. 이번에는 Form형태로 데이터를 주고받는 것을 연습해보고 싶어서 jquery를 사용한 AJAX 통신은 하지 않고 thymeleaf 로만 구성을 해보았는데 새로운 방식으로 통신하는 것 들이 생각보다 재미있었다.

POJO

Plain Old Java Object의 줄임말로 ‘평범한 구식 자바 오브젝트(객체)'를 말한다. 기존의 비즈니스 로직을 EJB가 아닌 평범한 자바 객체로 처리하는 것이 장점이 있는데도 사람들이 사용하지 않는 이유는 그럴듯한 이름이 없어서라고 결론을 냈고 마틴 파울러가 2000년 컨퍼런스의 발표를 준비하면서 만들어 낸 용어이다.

기존 EJB는 낮은 생산성과 느린 성능, 불필요한 기술적인 복잡도, 과도하게 높아진 스펙 등으로 인해 자바의 엔터프라이즈 개발에 대한 불신을 가중시켰다.

이에 마틴 파울러를 비롯한 많은 오피니언 리더들은 EJB와 같은 잘못 설계된 과도한 기술을 피하고, 객체지향 원리에 따라 만들어진 자바 언어의 기본에 충실하게 비즈니스 로직을 구현하는 일명 POJO 방식으로 돌아서야 한다고 지적하고 나섰다. POJO 방식의 개발은 EJB가 잃어버린 소중한 가치인 객체지향적인 설계와 자동화된 테스트의 편의성, 개발생산성 등을 회복시켜 줄 수 있는 길이기 때문이다.

하지만 복잡한 로우레벨의 API를 이용해 코드를 작성해야 하고, 많은 기술적인 문제를 애플리케이션 코드에 그대로 노출시켜 개발해야 한다면 기껏 POJO로의 복귀 덕분에 얻은 많은 장점들을 놓칠 수밖에 없다.

그래서 등장한 것이 바로 하이버네이트, Spring과 같은 POJO 기반의 프레임워크이다. POJO 프레임워크는 POJO를 이용한 애플리케이션 개발이 가진 특징과 장점을 그대로 살리면서 EJB에서 제공하는 엔터프라이즈 서비스와 기술을 그대로 사용할 수 있도록 도와주는 프레임워크이고, 나아가 이는 기존의 EJB에서보다 훨씬 더 세련되고 나은 방법이다.

아래의 예시를 보면 POJO 기반의 코드를 조금 쉽게 이해할 수 있을것이다.

잘못된 POJO 기반 코드

class MyDAO {
public void foo(Connection con, UrVO urVO) throws MyException {
           PreparedStatement pstmt = null;
           try {
              pstmt = new LoggablePreparedStatement(con, QueryFactory.getInstance().getQuery("FOO"));
          pstmt.setInt(1, urVO.getSeq());
          if (pstmt.executeUpdate() != 1) {
                throw new MyException("SVM00009");
}
} catch (MyException e) {
       throw kble;
} catch (Exception e) {
       throw new MyException(e);
} finally {
       DBUtil.close(pstmt);
}
}
…
}

수정된 POJO 코드

public class MyDAO {
              private DataSource dataSource;
              private SimpleJdbcTemplate jdbcTemplate;
              private QueryFactory queryFactory;
              // setter methods
              public void foo(UrlVo urlVo) {
jdbcTemplate.update(queryFactory.getQuery("FOO"), urlVo.getSeq());
		}
}

JPA

JPA는 Java Persistence API의 약자로 자바 ORM 표준 인터페이스의 모음을 의미한다.

JAVA가 제공하는 ORM에 관한 명세 표준으로 JPA는 특정 기능을 하는 라이브러리가 아니다. JPA 인터페이스를 구현체가 대표적으로 Hibernate이다. 이들의 핵심 모델은 EntityManager영속성 컨텍스트라고 할 수 있다.

  • EntityManager
    Entity를 관리해주는 역할로, 매 요청마다 EntityManagerFactory에서 EntityManager를 생성하고, EntityManager는 내부적으로 DB 커넥션 풀을 사용해서 DB에 접근한다.
  • PersistenceContext(영속성 컨텍스트)
    Entity를 영구 저장하는 환경이다. persist()로 db에 객체를 저장하는 과정에 있어서 DB에 저장하기 전 persist() 시점에 영속성 컨텍스트에 entity가 올라오고 EntityManger에 의해 관리를 받는 상태가 된다. 실제 DB에 저장은 이후에 이루어진다.
    영속성 컨텍스트가 엔티티를 관리하는 것의 장점
    • 1차 캐시
    • 동일성 보장
    • 트랜잭션을 지원하는 쓰기 지연
    • 변경 감지
    • 지연 로딩

싱글톤 패턴

생성자가 여러 차례 호출되더라도 객체의 인스턴스가 하나만 생성되어 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 패턴이다.

요청이 많은 곳에서 하나의 인스턴스를 메모리에 등록하면 여러 스레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있으므로 효율이 좋아진다.


참고자료

1.https://kdata.or.kr/info/info_04_view.html?field=&keyword=&type=techreport&page=215&dbnum=127681&mode=detail&type=techreport
2.https://www.martinfowler.com/bliki/POJO.html
3.https://www.geeksforgeeks.org/pojo-vs-java-beans/
4.https://www.martinfowler.com/bliki/POJO.html
5.https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html
6.https://sdesigner.tistory.com/101
7.https://ict-nroo.tistory.com/130
8.https://ultrakain.gitbooks.io/jpa/content/chapter3/chapter3.3.html
9.https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
10.https://webdevtechblog.com/%EC%8B%B1%EA%B8%80%ED%84%B4-%ED%8C%A8%ED%84%B4-singleton-pattern-db75ed29c36
11.https://dodeon.gitbook.io/study/kimyounghan-spring-core-principle/05-singleton

좋은 웹페이지 즐겨찾기