개발/끄적이기

항해99 3주차 WIL - Spring입문

라니킴 2021. 11. 28. 21:36

2021.11.15~11.21

😀이번주


드디어 spring에 입문했다. spring이 무엇인지 느낌만 받은 것 같다.
개인과제와 팀과제를 끝내고 헷갈리는 개념들을 하나씩 공부했다. 
인프런에서 김영한님의 스프링입문 강의를 수강하면서 스프링은 복잡하고 깊이가 있는 프레임워크라는 알 수 있었다. 앞으로 어떤 부분을 더 공부해나가야 하는지 도움을 많이 받은 것 같다.
이번 주 공부하면서 궁금했던 내용을 정리했다. 


### 스프링의 특징
* 의존성 주입(DI)
* 제어권 역전(IoC)
* 관점 지향 프로그래밍(AOP)

 

✅11.15(월)

😀 오늘

spring을 시작했다.
Spring 기초 사용법을 배우고 RDBMS, SQL, Lombok, JPA를 사용해보았다.

 

📚학습

트랜잭션이란? (Transaction)

 

쪼개질 수 없는 업무처리의 단위.

데이터베이스 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위

DB 테이블에서 데이터를 읽어 온 후 다른 테이블에 데이터를 입력하거나 수정, 삭제하는데 처리 도중 오류가 발생하면 모든 작업을 원상태로 되돌린다.

  • 트랜잭션의 특징 ACID
    1. Atomicity 원자성 : 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 한다.
    2. Consistency일관성: 트랜잭션의 작업 처리 결과는 항상 일관성이 있어야 한다.
    3. Isolation 독립성: 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
    4. Durability 영속성: 트랜잭션이 성공적으로 완료되었으면 결과는 영구적으로 반영되어야 한다.

JPA(Java Persistant API)

자바 ORM기술에 대한 표준명세로 JAVA에서 제공하는 API

SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 일종의 번역기이다.

자바 어플리케이션에서 RDB를 사용하는 방식을 정의한 Interface(ORM을 사용하기 위한 Interface를 모아둔 것이라고 생각하면 된다)

  • ORM이란? (Object Relational Mapping) 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다. ORM을 통해 SQL을 자동으로 생성하여 관계의 불일치를 해결한다.
  • Persistence(영속성) layer 프로그램의 아키텍처에서. 데이터에 영속성을 부여해주는 계층 데이터베이스에 데이터를 CRUD하는 계층

spring구조

controller - service - repository

Controller

가장 바깥 부분, 요청/응답 처리함.

서비스와 view의 중개자 역할. 해당 요청 url에 따라 적절한 view와 mapping 처리

Model

  1. DAO(Data Access Object)

DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체.

Domain logic (비즈니스 로직이나 DB와 관련없는 코드들)을

persistence mechanism과 분리하기 위해 사용한다.

  1. DTO(Data Transfer Object)

디비에서 데이터를 얻어 service나 controller로 보낼 때 사용하는 객체.(계층간의 소통)

보통 로직을 가지고 있지 않고 데이터와 데이터에 접근하기 위한 getter, setter만 가지고 있다.

  1. Service

비지니스 로직이 들어가는 부분.

컨트롤러가 지정하는 처리 중 대부분을 수행하는 패키지로, 요청을 받아 수행하게 될 로직들을 하나의 서비스 단위로 묶은 트랜잭션을 생성하여 처리한다

아직은 service가 담당하는 부분이 자세히 이해가지 않는다...

연습 프로젝트에서는 update같은 부분을 담당했는데 단순히 DB에서 받아온 데이터를 controller로 보내주는 작업 이외의 작업을 담당한다고 생각하면 되는걸까...?

❓추가로 공부할 것

  • MVC패턴

 

✅ 11.16(화)
 

😀 오늘

3주차 - spring기본

  • Memo하는 프로젝트를 만들어봤다. 프로젝트 시작 전 미리 API설계하고 필요한 기능을 정리해보았다. 전체 그림을 그려놓고 시작하니깐 헷갈리는 부분이 덜했던거 같다.
  • spring 구조를 손에 익게 하는데 집중했다. 아직 DTO의 개념이 어렵다.
  • 네이버API를 사용해보면서 API를 가져다 쓰는 방법을 연습했다.
  • AWS RDS구매하고 MYSQL 세팅
  • spring boot를 MYSQL과 연결하기
  • AWS EC2서버사고 프로젝트 배포파일 빌드.
  • filezila 사용.
    전체 flow대로 생각하고 code작성하는게 쉽지 않다....

📚 학습

  • put과 patch의 차이점patch는 부분수정. 수정하고자 하는 필드만 입력이 가능하다.
  • put은 전체수정, 수정시 전체 필드를 입력해야한다. 일부만 입력시, 전달한 필드 외 모든 필드는 null 또는 초기값이 된다.
  • 웹의 동작 원리
  • 간단하게 정리하자면 사용자가 도메인을 보내면 DNS서버로 간다. DNS서버는 도메인을 해석해 IP주소를 사용자에게 돌려준다. 사용자는 받은 IP주소로 서버에 접속한다. 웹 서버는 웹페이지를 웹 브라우저로 반환하고, 웹 브라우저는 이 페이지를 표시한다. 이전에 접속했던 IP 주소는 일정기간 컴퓨터에 저장되므로 더 빠른 응답이 가능하다.

 

✅ 11.17(수)

 

개인 과제 시작

<블로그 만들기 프로젝트>

  • 구현할 기능
  1. 전체 게시글 목록 조회 페이지
    • 제목, 작성자명, 작성 날짜를 조회하기
    • 작성 날짜 기준으로 내림차순 정렬하기
    • 특정 게시글을 클릭할 경우 게시글 조회 페이지로 이동하기
  2. 게시글 작성 페이지
    • 제목, 작성자명, 작성 내용을 입력하기
    • "글쓰기" 버튼을 클릭하면 전체 게시글 목록 조회 페이지로 이동하고, 최신 게시글이 최상단에 위치함을 확인하기
  3. 게시글 조회 페이지
    • 제목, 작성자명, 작성 날짜, 작성 내용을 조회하기

API설계

기능MethodURLReturn

전체 게시글 조회하기 GET /api/memos List
게시글 작성 POST /api/memos Memo
선택한 게시글 조회 GET /api/memos/id Memo

처음하는 설계 어렵다. 처음이라 이렇게 하는 것이 맞는 지 모르겠다.
효율적으로 하는 방법을 고민해봐야겠다...

😂


메인 페이지에서 게시글을 선택하면 선택한 게시글을 보여주는 페이지로 이동을 해야하는데 이 과정에서 게시글의 ip를 넘겨줘서 DB에서 데이터를 받아올 계획이었다. 페이지가 이동할 때 ajax에게 ip를 어떻게 넘겨줘야하는지에 대해서 많은 고민을 했다. 페이지가 이동하기 때문에 그냥 넘겨줄 경우 ajax 콜이 잘 되지 않았다. 결국은 Query string 을 이용해 ip정보를 추출하고 이를 ajax에게 넘겨주었다.

functionsearchParam(key) {
    return new URLSearchParams(location.search).get(key);
}
let id =searchParam('id');