Back-end

    JPA 프록시 객체와 지연로딩

    JPA 프록시 객체와 지연로딩

    도입 정말 오랜만에 JPA와 관련된 글을 작성하는 듯하다. 약 2주정도는 갑작스럽게 영어 스피킹 시험을 보고 싶다는 핑계로 JPA에 대한 글을 잠시 미루고 열심히 영어에 매진하였다. 결과는 망했지만. 이번에 우리는 JPA의 프록시 객체와 지연로딩에 대하여 알아보려고 한다. 프록시 객체? Proxy는 번역하면 대리라고 할 수 있다. 남을 대신하는 무엇인가를 프록시라고 한다. 프록시 객체는 말 그대로 객체를 대신한다는 의미를 포함하고 있다. 객체를 대신한다는 말이 무엇을 의미할까. DB에 있는 값을 영속성컨텍스트로 관리하려면 find()를 사용한다. find를 부르게 되면 영속성 컨텍스트에 값이 있는지 확인하고 없다면 DB로 쿼리가 날라가서 값을 가져올 것이다. find가 아닌 다른 방법으로 DB에 있는 객..

    JPA 상속관계 매핑하기(+ @MappedSuperclass)

    JPA 상속관계 매핑하기(+ @MappedSuperclass)

    도입 지난 시간에 JPA를 활용해 객체와 연관관계 매핑을 하는 방법을 알아보았다. 이번 시간에는 JPA를 활용하여 객체의 상속관계를 테이블로 표현하는 방법에 대하여 알아보고, 상속관계와는 다르지만 비슷해서 혼동하기 쉬운 개념인 @MappedSuperclass를 알아보도록 하겠다. 상속관계 매핑 객체지향언어에서는 중복되는 정보를 상속관계를 사용해 묶어줄 수있다. 예를들어 사람과 강아지 고양이는 모두 이름과 나이 그리고 구분지어줄 ID를 가지고 있다. 이러한 특징을 '동물'로 묶어서 상속해줄 수 있다. 객체에서는 이렇게 상속을 허용해주지만, 테이블에서는 이렇게 상속을 할 수 없다. 따라서 상속을 위해서는 전략을 사용해야한다. 상속의 전략을 사용하기 위해서는 @Inheritance annotation을 이용하..

    JPA 연관관계 매핑하기

    JPA 연관관계 매핑하기

    도입 이번 시간에는 JPA에서 엔티티를 객체적으로 묶어보는 시간을 가져보려고 한다. DB처럼 구현을 하게 될 경우 연관이 되어있는 클래스에는 다른 엔티티의 key값을 넣어주게 되는데, 그러면 다시 그 키값으로 객체를 찾아주어야하는 번거로움이 생긴다. 따라서 이번시간에는 객체 자체를 받을 수 있는 연관관계 매핑을 알아보도록 하겠다. *지난 시간에는 기본키를 매핑하는 방법과 키값을 자동으로 주입시키는 전략을 알아보았다. 2022.01.12 - [Tech-Stack & Language/JPA] - JPA 기본 키 매핑하기 JPA 기본 키 매핑하기 도입 지난 시간에는 필드와 칼럼을 매핑하여 보았다. 이번에는 매핑된 칼럼중에서 Primary key를 지정하는 방법을 알아보도록 하겠다. Primary Key란 기본..

    JPA 기본 키 매핑하기

    JPA 기본 키 매핑하기

    도입 지난 시간에는 필드와 칼럼을 매핑하여 보았다. 이번에는 매핑된 칼럼중에서 Primary key를 지정하는 방법을 알아보도록 하겠다. Primary Key란 기본키를 의미한다. 기본키의 성질은 테이블 내에서 유일하고 null값이 없어야하며 변경되면 안된다. 따라서 테이블에서 데이터들을 유일하게 구분하는데 사용이된다. 이번 시간에는 이러한 기본 키를 매핑하는 방법을 알아보도록 하자. 2022.01.10 - [Tech-Stack & Language/JPA] - JPA로 필드와 칼럼 매핑하는 annotation 알아보기 JPA로 필드와 칼럼 매핑하는 annotation 알아보기 도입 지난 시간에는 객체와 엔티티를 매핑하는 방법에 대하여 알아보았다. 객체와 엔티티를 매핑하였다면, 다음에는 각 객체가 가지고 ..

    JPA로 필드와 칼럼 매핑하는 annotation 알아보기

    JPA로 필드와 칼럼 매핑하는 annotation 알아보기

    도입 지난 시간에는 객체와 엔티티를 매핑하는 방법에 대하여 알아보았다. 객체와 엔티티를 매핑하였다면, 다음에는 각 객체가 가지고 있는 속성(필드)와 엔티티의 칼럼을 매핑해주어야 한다. 이번 시간에는 칼럼과 필드를 매핑하는 과정을 알아보도록 하겠다. 2022.01.07 - [Tech-Stack & Language/JPA] - JPA로 객체와 테이블 매핑하기 JPA로 객체와 테이블 매핑하기 도입 지난 시간에는 JPA의 영속성 컨텍스트에 대하여 알아보았다. 영속성 컨텍스트는 JPA의 동작을 이해하기 위해 반드시 알아야할 부분으로 매우 중요한 내용이었다. 이번 시간도 JPA를 공부할 cnu-jinseop.tistory.com 칼럼과 필드를 매핑하는 방법 칼럼과 필드를 매핑하는 경우도 동일하게 어노테이션을 사용하..

    JPA로 객체와 테이블 매핑하기

    JPA로 객체와 테이블 매핑하기

    도입 지난 시간에는 JPA의 영속성 컨텍스트에 대하여 알아보았다. 영속성 컨텍스트는 JPA의 동작을 이해하기 위해 반드시 알아야할 부분으로 매우 중요한 내용이었다. 이번 시간도 JPA를 공부할 때 매우 중요한 부분을 알아보려고 한다. ORM은 객체로 RDB를 사용하는 기능을 제공한다고 하였다. JPA가 ORM으로 동작하기 위해서 객체와 테이블을 매핑해주어야 한다. 이번 시간에는 JPA로 어떻게 객체로 테이블을 매핑하는지 알아보도록 하겠다. 테이블 - 객체 연결 Annotation을 이용하자. 객체와 테이블을 매핑하기 위해서는 2개의 Annotation만 사용하면 된다. 클래스 하나당 하나의 테이블로 매핑을 시켜주어야 하므로 클래스에 @Entity를 붙여 주어야 한다. 그리고 어느 값이 키 값인지 알아내기..

    JPA 영속성 컨텍스트란?

    JPA 영속성 컨텍스트란?

    도입 지난 포스팅에선 JPA를 활용하여 데이터를 저장하고 삭제하고 변경하는 작업을 해보았다. JPA를 사용하여 CRUD를 진행할 때 어떠한 원리로 동작을 하게 되는지 굉장히 많이 궁금하였다. 이번 포스팅에서는 JPA의 작동원리인 영속성 컨텍스트에 대하여 알아보려고 한다. 영속성 컨텍스트? 영속성 컨텍스트란 엔티티를 영구히 저장하는 환경으로 JPA의 저장공간이라고 생각하면 된다. 객체를 생성하고 JPA를 활용하여 DB에 넣어주게되면, 쿼리로 바로 DB에 넣어주는 것이 아니라 영속성 컨텍스트라는 공간에 따로 저장을 해두는 것이다. 해당 트렌잭션이 끝날 때(commit) 그 동안 모아둔 쿼리를 DB에 쏴주게 된다. 여기서 중요한 것은 영속성 컨텍스트는 당연히 하나의 트렌젝션에서만 공유가 된다. 언제 영속성 컨..

    JPA로 CRUD하기

    JPA로 CRUD하기

    도입 지난 시간에 JPA 프로젝트를 설정하는 방법에 대하여 알아보았습니다. 이번시간에는 JPA로 CRUD를 하는 것을 알아보도록 하겠습니다. CRUD는 Create, Read, Update, Delete의 약자로 생성, 읽기, 갱신, 삭제를 의미합니다. 이번 포스팅에서는 DB에 데이터를 넣고, 조회하고, 수정하고, 삭제하는 방법을 알아보도록 하겠습니다. 시작 전에 JPA? 객체지향적인 언어와 RDB는 구현할 때 굉장히 모순적인 부분이 많습니다. 객체들이 협력하며 만들어낸 결과물들을 DB에 저장을 할 때는 객체가 아닌 테이블에 저장이 되기 때문에 테이블로 각각 데이터를 넣어주어야하는 번거로움이 있습니다. 이로써 객체지향적으로 프로그램을 개발하여도 RDB와 연동시켜주는 과정에서 굉장히 적은 생산성을 보여주었..

    JPA 프로젝트 설정(Maven, H2 DB)

    JPA 프로젝트 설정(Maven, H2 DB)

    H2 DataBase JPA를 사용하기 위해서는 데이터베이스가 필요합니다. 실습에 활용하기 좋은 DB인 H2를 사용하도록 하겠습니다. H2 DB의 장점은 굉장히 가볍습니다. 그리고 MySQL이나 Oracle DB 시뮬레이션도 가능합니다. H2 DB를 설치하는 방법을 알아보도록 하겠습니다. 설치 방법 H2 DB를 설치하기 위해서는 해당 웹페이지를 들어가보도록 하겠습니다. H2 DB 웹페이지 바로가기 H2 Database Engine (redirect) H2 Database Engine Welcome to H2, the free SQL database. The main feature of H2 are: It is free to use for everybody, source code is included Wr..

    PRG Post/Redirect/Get

    PRG Post/Redirect/Get

    도입 물건을 주문하는 서비스를 개발하거나 회원을 등록하는 서비스를 개발할 때 HTTP의 Post 메소드를 주로 사용한다. 이 때, Post로 상품을 주문하도록 하고, 웹페이지를 바로 랜더링했다고 생각하면 매우 끔찍한 일이 벌어진다. 왜냐면 최종적인 HTTP가 Post이기 때문에 만약 사용자가 결제 후 랜더링된 페이지에서 새로고침을 누르면 중복해서 결제가 진행되기 때문이다. Post - Redirect - Get PRG를 사용해야하는 이유는 도입부분에서 매우 자세하게 설명이 되어있다. 클라이언트가 form tag에 데이터를 입력하고 주문을 하면 Post로 데이터가 넘어와 서버에서 해당 부분을 처리하게 된다. 이렇게 처리가 된 경우 최종적인 HTTP입력이 Post이므로 새로고침시 계속해서 Post가 실행되는..

    Server Side Rendering (Thymeleaf)

    Server Side Rendering (Thymeleaf)

    도입 서버 개발자가 웹페이지를 구성하여 보여주는 기능을 SSR이라고 한다. SSR은 여러가지 방법으로 구현될 수 있는데 그 기술 중 네츄럴 템플릿인 Thymeleaf를 알아보도록 하자. SSR(Server-Side Rendering) 서버 개발자가 보여주고 싶은 웹페이지를 구성하여 보여주는 방법을 SSR이라고 한다. 서버를 활용하여 웹페이지를 랜더링하기 때문에 CSR(Client-Side Rendering) 보다는 페이지를 생성하여 보여주는 것보다 느리지만, 데이터를 가져와 웹페이지의 콘텐츠를 모두 추가하여 보여주는 면에서는 더 빠르다. Thymeleaf SSR을 구성하는 방법 중 하나로 Thymeleaf가 있다. 이 기술의 특징은 네츄럴 템플릿 이라는 점이다. Html의 tag안에 동적으로 서버에서 처..

    HTTP Message Converter

    HTTP Message Converter

    도입 HTTP의 바디에 값을 넘겨줄 때 view를 활용하여 html을 생성해서 보내줄 수도 있고 간단하게 json이나 String 형식으로 넘겨줄 수 있다. json이나 String형식으로 넘겨줄때는 HTTP Message Converter를 사용하면 편리하게 넘겨줄 수 있다. 오늘은 HTTP Message Converter를 알아보도록 하겠다. HTTP Message Converter HttpMessageConverter는 requset로 넘어온 body 데이터 값을 받아오거나 혹은 response로 데이터를 body에 보낼 때 적절하게 변환해주는 역할을 수행한다. 예를들어 @ResponseBody annotation이 붙어있는 메소드가 실행이 될 때 적절한 HTTP Message Converter를 ..

    SSR Response, Response Body

    SSR Response, Response Body

    도입 서버의 개발자가 사용자에게 페이지를 구상하여 보여주는 것을 SSR(Server Side Rendering)이라고 한다. 여러가지 종류가 있지만 나는 주로 Thymeleaf를 사용하여 처리한다. 이번에 공부한 내용은 동적인 웹페이지를 위해 SpringMVC에서 데이터를 넘겨주는 방법과 Response Body를 알아보겠다. View로 데이터 넘겨주는 방법 Thymeleaf로 데이터를 넘겨주는 다양한 방법을 알아보고자 한다. @RequestMapping("/response-view-v1") public ModelAndView responseViewV1(){ ModelAndView mav = new ModelAndView("response/hello") .addObject("data","hello!");..

    Request Body 받아오기

    Request Body 받아오기

    Client가 Server로 혹은 Server가 Server로 Request를 할 수 있다. 이번 포스팅에서는 Request가 왔을 때 Body를 String과 Json방식으로 받아오는 두가지 방법을 확인하겠다. 김영한님의 MVC 강의를 수강 후 작성된 포스팅이다. 1. Body가 String인 경우 Servlet의 모든 기능을 지원하기 때문에 Servlet처럼 받는 것도 가능하다. 하지만 이 경우 불필요하게 HttpServletRequest를 모두 받아야하므로 비효율적이다. 따라서 원하는 부분만 받아서 실행할 수 있다. @PostMapping("/request-body-string") public void requestBodyString(InputStream inputStream, Writer resp..

    Request Parameter 가져오기

    Request Parameter 가져오기

    도입 Spring MVC는 굉장히 편리하게 Request Parameter를 받을수 있다. 과거 Servlet에서는 HttpRequest 객체로부터 getParameter를 받았던 것과 유사하게 받을 수도 있고, 더욱 편리하게 받을 수 도 있다. 이번 포스팅에서는 Servlet에서 Parameter를 받는 것을 시작으로 Spring MVC가 편리하게 받는 방법까지 알아보도록 하겠다. Request Parameter 받는 방법 1. Servlet처럼 받기 @RequestMapping("/request-param") public void requestParam(HttpServletRequest request, HttpServletResponse response) throws IOException { Stri..

    스프링 빈 등록방법과 사용예시

    스프링 빈 등록방법과 사용예시

    Spring Bean이란? Spring의 Bean은 Spring IOC Container가 관리하는 객체들을 의미합니다. 따로 new 연산을 통해 객체를 생성하지 않아도 되고, Spring IOC Container에게 알려주기만 하면 객체를 만들어 사용해 줍니다. Spring Bean을 사용하면 여러 클래스에서 따로 new연산을 하여 동일한 여러 객체를 만들 필요도 없어 메모리 활용에 효과적입니다. Spring IOC Container에서 가지고 있는 동일한 인스턴스만 사용하기 때문에 많은 이점을 얻을 수 있습니다. 그렇다면 이번 시간에는 Spring Bean에 등록하는 방법을 알아보도록 하겠습니다. Spring Bean 등록 방법? 등록하는 방법은 크게 두가지가 있습니다. Component Scan 직..

    Test Case 만들기

    Test Case 만들기

    이번 포스팅에서는 서비스를 생성하고, 동작이 원활히 수행되는지 테스트를 해야합니다. main 메소드를 사용하여 출력하기 직접 DB에 넣고 실행해보기 등등 다양한 방법으로 테스트를 할 수 있습니다. 이번 시간에는 Spring으로 Service를 만들며 굉장히 편리한 Test Case를 활용하여 테스트를 수행하는 방법을 알아보도록 하겠습니다. Test Case test파일에서 Class를 생성하여 주시고 작업을 수행하면 됩니다. 메소드에 @Test라는 anotation만 붙여주고 사용하면 됩니다. 예시로 간단한 스펙의 서비스를 만들어보겠습니다. public int join(Member member) { nameCheck(member); repository.save(member); return member.g..

    Static,MVC,API

    Static,MVC,API

    이 글은 김영한 개발자님의 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 강의를 듣고, 배운 내용을 제가 필요할 때 찾기위해 요약한 글 입니다. Static static? 웹을 html 그대로 static으로 보여주는 방법. 'resources/static/' 경로에 html파일을 직접 넣어주면 됨. 스프링 부트에서 항상 Controller가 있는지 확인하고, 없으므로 resources/static/에서 원하는 html을 찾아서 웹브라우저에 올려줌. 접근하기 위해서는 html 확장자 까지 작성해야함. 이 때, hello-static에 접근하고 싶으면, /hello-static.html로 검색해야함. MVC MVC? Model, View, Controller로 하는 역할을 나..