Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

스프링 입문 - 웹 개발 기초 <3> 본문

Spring

스프링 입문 - 웹 개발 기초 <3>

JH_Lucid 2021. 5. 20. 20:28

1. 회원 웹 기능 - 홈 화면 추가

- 컨트롤러가 정적 파일보다 우선순위가 높다. 요청이 오면, 컨테이너를 먼저 찾고, static 파일을 뒤진다.

- 따라서 이전에 만들어 둔 index.html은 무시되고, 아래 home.html이 뜬다.

 

2. 회원 웹 기능 - 등록

 

- 아래의 createMemberForm.html을 view resolver에 의해 찾아져서, thymeleaf에 의해 렌더링 됨

- method가 'post'임

- PostMapping : 데이터를 전달할 때 쓰는 매핑(데이터 등록)

- GetMapping : 기본적으로 url에 치는 방식(조회)

- url은 같지만, post이기 때문에 create가 실행됨.

* 자바빈 프로퍼티 규약 : getter / setter name을 property name과 동일하게 해야 함.

  (예를 들어 name1이면 getName1 / setName1이라는 메서드를 만들어야 함

   -> html에서 post로 입력된 name이라는 이름을 보고 스프링 MVC가 setName을 호출하게 된다.

        따라서 MemberForm form이 알아서 생성된다.

   -> 스프링 MVC는 http 파라미터로 넘어오는 모든 이름을 인식해서(name, age 등) MemberForm 객체(직접 만든 아무 객체 상관 없음)에 동일한 프로퍼티 이름이 있으면 찾아서 넣어준다.

 

 

1) 마지막으로, '회원 목록'을 누르면 아래 list가 실행된다.

2) model.addAttribute를 통해 members라는 List를 생성하여 memberList.html로 전달한다

 

 

* cmd + e -> 최근에 봤던 파일로 이동할 수 있다.

3) Thymeleaf에서 전달된 멤버를 foreach 비스무리한걸 통해 렌더링해서 화면에 뿌려준다.(by template 언어)

     -> $members를 통해 모델안의 값을 꺼낼 수 있다. 

4) member.id -> getter / setter 접근 방식으로, 우리가 정의한 getId, getName을 통해 값을 불러서 렌더링해준다.

 

5) 최종적으로 아래와 같이 렌더링되어, 화면에 뿌려준다.

 



1. H2 데이터베이스 설치

- JPA 사용하면, 객체를 바로 DB에 쿼리 없이 저장 / 관리할 수 있다.

- 스프링 데이터 JPA - 사용하기 쉽게 한번 더 감싼 기술

- 순수 'JDBC'로 한번 개발해보자.

 

- Study/h2/bin에 들어가서 ./h2.sh로 실행하기.

- 터미널 홈에 test.mv.db 생성되어야 함.

 

 

- generated by dafault as identity -> 값 세팅 안하고 insert 시, db가 알아서 만들어 줌

- 같은 원리로 우린 repository에서 구현하였음

 

- sql & ddl.sql로 관리


2. 순수 JDBC

- 과거의 방식에 대해서 배워보자..

 

- 기존에는 memoryMemberRepository 사용했었음.

- JDBC 리포지토리 구현

 

- 코드 추가(JdbcMemberRepository) 후, config에서만 수정해줬다!!

- DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다. 스프링 부트는 데이터베이스 커넥션 정보를 바탕으로, DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다.

- 조립부분만 손대면, 다른 곳은 수정할 필요 없다는 의미.

- database에 접근해서 정상 동작 확인 함.

 

- 컨테이너에서 설정을, jdbc 버전으로 등록했다. 나머지는 손 안댐

- 메모리 -> h2 db로 변경함.

 

- 개방-폐쇄 원칙(OCP, Open-closed Principle)

   -> 확장에는 열려있고, 수정, 변경에는 닫혀있다.

- 스프링의 DI를 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.

- 회원을 등록하고 DB에 결과가 잘 입력되는지 확인 ok

- 데이터를 DB에 저장하므로, 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다.

 


 

3. 스프링 통합 테스트

- 스프링 컨테이너와 DB까지 연결한 통합 테스트를 진행해봅시다.

- @Transactional : db에 쿼리 날리고, 끝날 때 그 데이터를 롤백(반영을 안함) > 다음 테스트 반복 가능

   -> 테스트케이스에 붙었을 때만 롤백

- @Commit : 그냥 바로 커밋 해버림

 

+ 그럼 스프링 없이 자바로만 했던 기존 테스트는? : (순수한 )단위 테스트라고 명명, 더 빠르긴 하다.

   스프링 컨테이너 없이 테스트 할 수 있도록 훈련해야 한다.

 

 


4. 스프링 JdbcTemplate

-> template를 이용하여, 3에서 순수 Jdbc Api를 사용했던 것과 비교하여, 조금 더 간략한 코드로 작성 가능하다.

-> 반복코드 줄일 수 있다

-> 하지만 SQL은 여전히 작성해야 한다.

 


5. JPA

-> SQL도 자동으로 생성해준다.

-> SQL, 데이터 중심 설계 -> 객체 중심의 설계로 패러다임 전환 할 수 있다.

 

-spring-boot-starter-data-jpa : jdbc라이브러리도 포함한다.

- show-sql : JPA가 생성하는 SQL을 출력한다.

- ddl-auto : JPA는 테이블을 자동으로 생성하는 기능을 제공하는데, none을 사용하면 해당 기능 끈다.

   - create 사용하면 엔티티 정보를 바탕으로 테이블도 직접 생성해준다 -> 해보자.

 

-orm : object relational mapping by annotation

 

@GeneratedValue(strategy = GenerationType.IDENTITY)

-> db가 자동으로 id를 ++ 해주는 기능 : identity

 

- jpa : 인터페이스

- hybernate : 구현체

 


6. 스프링 데이터 JPA

-> only interface만으로 개발 가능

-> 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공

-> 핵심 비즈니스 로직에 집중 가능

-> JPA 학습 후, 스프링 데이터 JPA 학습해야 함(JPA를 편리하게 사용하게 하는 기술임)

 

스프링 데이터 JPA가 SpringDataJpaMemberRepository를 스프링 빈으로 자동 등록해준다.

- 결국, 인터페이스만 extend하면, 기본 구현체(CRUD)는 만들어져 있는 것을 사용하면 된다.

- findByName(), findByEmail()처럼 메서드 이름 만으로 조회 기능 제공

- 페이징 기능 자동 제공

 

- 하지만, 예를 들어 내가 name으로 찾고 싶으면? -> 공통할 수 있는게 아닌 나만 사용하는 것이므로 구현 필요(아래 구현)

 

-> findByName -> //JPQL select m from Member m where m.name =?로 번역되어 실행

 

 

Comments