항해99 3기

[WIL] 항해99 3기 3주차 : Spring 심화 강의

na_o 2021. 10. 3. 23:45
728x90

Spring 기본 강의를 듣고 게시판을 만들었다

https://github.com/NayoungBae/blog

 

GitHub - NayoungBae/blog

Contribute to NayoungBae/blog development by creating an account on GitHub.

github.com

요구사항이 많지 않아서 요구사항을 모두 만족시키기에는 오래 걸리지 않았다

요구사항을 모두 만들고 검색이나 삭제, 페이징 처리 등 기능 추가도 마쳤다

JPA에 Pageable이 있어 페이징 처리에 필요한 데이터는 쉽게 받았지만,

그것을 기능으로 만드는게 복잡했다

그래도 제 기능 하도록 마무리를 잘 했다고 생각한다


프로젝트를 제출하고 그 다음 날부터 Spring 심화 과정을 수강해야 했다

강의가..너무 많다..그래서 TIL을 못 썼다ㅠ

 

Spring 기본 강의는 1주일에 약 두시간정도 분량의 강의로 이루어져있었다. 총 5주짜리다

하지만 심화 강의는 1주일에 최대 5시간 반 분량이다..

이걸 어떻게 4일만에 다 듣나..ㅠ나한텐 불가능이다

 

그래서 목요일부터 시작해서 이틀동안 강의를 2추차까지 듣고 토요일에 프로젝트를 시작했다

시간이 부족할것 같아서 위에 걸려있는 게시판 프로젝트를 가져와 이어서 할거다

 

회원가입 로직을 짜고, Spring Security를 가지고 로그인 기능을 넣는데 하루가 걸렸다

처음 써보는데 너무 복잡해서 일단 코드를 가져다가 쓰고, 필요한 부분을 조금 수정했다

 

그대로 가져다가 쓰는데도 기능 동작이 역시 잘 안됐다

input에 입력한 데이터를 갖고오지 못하고 있었다

https://dublin-java.tistory.com/31

 

[Spring Security] loadUserByUsername(String username)에서 username이 empty일 때

스프링 시큐리티를 이용해서 로그인을 하는데 public class MemberDetailsService implements UserDetailsService { public final MemberService memberService; @Override @Transactional(readOnly = true) publi..

dublin-java.tistory.com

MemberDetailsService를 구현한 MemberDetailsServiceImpl에서

loadUserByUsername 함수의 매개변수의 값을 출력해보니 비어있었다

나와 같은 경우가 나타나는 사람들이 많았나보다

 

새롭게 알게 되었는데 form 태그에서 값을 넘겨줄 때 name 속성"username", "password"라고 적어줘야

Spring Security가 인식이 가능한 거였다

나는 "nickname", "password"라고 적어놨기 때문에 닉네임의 값을 못 받아오고 있었다

 

이거때문에 고치고 싶은 오기가 생겨서 너무 늦게 잤다

해결하고 자서 그래도 맘 편히 잘 수 있었다

해결 못하고 누웠으면 꿈 속에서도 생각하고 있었을 거다


SpringBoot를 사용하면서 JPA를 처음 접해봤다

이것이 ORM의 한 종류라고 한다

 

[ORM]        https://velog.io/@dnjscksdn98/Database-ORM%EC%9D%B4%EB%9E%80

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것

 

JPA는 객체를 사용하는 JAVA와 데이터베이스(MySQL 사용중)을 연결해주고 있다

JPA에서 제공하는 함수를 JAVA에서 이용하면 그게 사용중인 DB SQL로 변환해준다

강의에서 번역기라고 설명해줬다

 

* 객체지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용
* ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결
* 객체를 통해 간접적으로 데이터베이스를 다룸
* Persistant API라고도 함

 

이전에 Spring을 다룰 땐 Mybatis를 이용했다

한 기능에서 쓰이는 SQL을 일일이 다 적어주고 잘 조회되는지 테스트를 한 뒤,

XML에 Mybatis로 싹다 적어줬었다

JPA를 배우니 정말 간편했다

 

 

 

[ORM의 장점]

* 객체지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와줌
* 재사용성 및 유지보수의 편리성 증가
* DBMS에 대한 종속성이 줄어듬

JPA의 규칙에 따라 함수를 적어주면 이것이 SQL로 변해 데이터를 다룬다

SQL을 썼으면 이게 어떤 기능을 하는지 일일이 다 읽어봐야한다

함수명만 보면 어떤 기능을 하는지 파악할 수 있다

 

파악을 좀 더 쉽게 할 수 있으니 수정하는데도 시간이 덜 걸린다

 

JPA는 사용하는 DB에 따라 알맞은 SQL로 알아서 변한다고 한다

JPA를 안 썼을 땐 프로젝트 도중 DB가 변경되면 DB에 맞게 SQL을 싹 다 수정해야 한다

프로젝트가 크다면..아찔하다

 

 

 

[ORM의 단점]

* 완벽한 ORM으로만 서비스를 구현하기 어렵
* 프로시저가 많은 시스템에서는 ORM의 객체 지향적인 장점을 활용하기 어렵

 

장점을 너무 많이 경험해서 단점을 느끼지 못했는데

사용하는 DB가 많아지면 테이블끼리 관계가 많아질텐데, 이런건 어떻게 정의하는건지 아직은 잘 모르겠다

JPA를 사용하면 간단해서 편리하겠지만, SQL을 모든 기능을 JPA로 대체 못할 것 같다


JPA가 SQL을 대신해준다고 하는데, 

 

[SQL(Structured Query Language)]        https://brunch.co.kr/@dan-kim/18

데이터베이스가 이해할 수 있는 질의 언어

 

영어, 독일어 등과 같이 DB라는 나라의 언어라는 것이다

여기서 "질의"라는 것은 우리가 원하고자 하는 데이터베이스에 요청한다는 의미다

미리 언어에 대한 규칙을 정해놨기 때문에 규칙에 맞춰 적어주면 사용할 수 있다

 

 

 

[DB가 어떻게 SQL을 이해하지?]

1. 띄어쓰기 단위로 구분

영어나 한국어 등과 같이 띄어쓰기 기준으로 단어를 구분한다

S, E, L, E, C, T까지 읽고나면 띄어쓰기를 만나게 되고 이전까지 적혀있던 알파벳을 합쳐본다

합쳐보니 SELECT라는 단어가 나오고, 사용자가 SELECT라고 입력했구나 라고 판단하게 된다

 

 

2. 예약어 매칭

사용자가 SELECT라고 입력했다는걸 알게 되면 이 SELECT는 이미 규칙이 정해져있다

DB를 조회하는 언어이고, 그 다음에 FROM이 나와야 한다

 

데이터를 조회해오기 위해서는 어떤 테이블에서 선택해야하는 지 정의되어 있어야 하고,

조회해야 하는 열을 쉽표로 구분해서 나열해야 한다

 

이처럼 DBMS(DataBase Management System)은 알파벳과 띄어쓰기를 가지고 어떤 예약어가 나오는 지 판단하고,

미리 정의되어있는 예약어의 규칙을 가지고 데이터의 삽입, 수정, 삭제, 추출의 과정을 한다

우리는 예약어의 규칙을 배워 SQL을 작성하는 것이다


지금까지 배워온 SpringBoot는 MVC, 크게 세 가지로 분리되어 만들어져왔다

 

[MVC(Model - View - Controller)]        https://wooaoe.tistory.com/15, 

소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴

 

* 디자인 패턴

건축으로 치면 공법에 해당하는 것으로, 소프트웨어의 개발 방법을 공식화한 것이다

소수의 뛰어난 엔지니어가 해결한 문제를 다수의 엔지니어들이 처리할 수 있도록 한 규칙이면서

구현자들 간의 커뮤니케이션의 효율성을 높이는 기법이다

 

* Model: 백그라운드에서 동작하는 로직을 처리
            (데이터를 가진 객체, 파라미터로 주로 쓰임 DB의 테이블과 대응하는 경우가 많음)
* View: 사용자가 보게 될 결과 화면을 출력
* Controller: 사용자의 입력처리와 흐름 제어 담당
                 (사용자가 접근한 URL에 따라 사용자의 요청사항을 파악한 후,
                  그 요청에 맞는 데이터를 Model에 의뢰하고, 데이터를 View에 반영해 사용자에게 알려줌)

 

 

 

https://m.blog.naver.com/jhc9639/220967034588

 

Model: 어플리케이션의 정보, 데이터를 나타냄. 데이터베이스, 처음 정의하는 상수, 초기화값, 변수 등을 뜻함

           이러한 정보들의 가공을 책임지는 컴포넌트를 말함

 

[Model의 조건]

1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 함

2. 뷰나 컨트롤러에 대해 어떤 정보도 알지 말아야 함

3. 변경이 일어나면, 변경 통지에 대한 처리 방법을 구현해야 함

 

 

 

View: 체크박스나 버튼 등 사용자 인터페이스 요소를 나타냄. 데이터의 입력, 출력을 담당.

         사용자가 보는 화면

 

[View의 조건]

1. 모델이 가지고 있는 정보를 따로 저장해서는 안됨

2. 모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야함

3. 변경이 일어나면 변경통지에 대한처리방법을 구현해야 함

 

 

 

Controller: 데이터와 사용자인터페이스 요소들을 잇는 다리 역할

               사용자가 데이터를 클릭하고, 수정하는 것에 대한 "이벤트"들을 처리하는 부분

 

[Controller의 조건]

1. 모델이나 뷰에 대해서 알고 있어야 함

2. 모델이나 뷰의 변경을 모니터링 해야 함