티스토리 뷰

Web 개발

[Web] Spring Boot with JPA - QnA

코딩브론즈 2021. 9. 21. 00:31

Q. 프로젝트 생성시 의존성 설치는 뭘 할까?

  • Spring Boot DevTools
  • Lombok
  • Spring Data JPA
  • MySQL Driver
  • SpringSecurity
  • Spring Web

 

Q. MySQL 환경세팅 - 권한 설정 및 한글설정(utf-8)

https://www.youtube.com/watch?v=GuHhQP0897s&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=5 

 

Q. application.properties 와 application.yml의 차이

https://youtu.be/G6fgEiI_pEA?t=83 

=> 들여쓰기로 인해 중복되는 코드가 줄어진다.

 

Q. Git 세팅

  • github 레포지토리 생성
  • git 설치
  • 프로젝트 우클릭 -> Git Bash Here
git init

git add .

git commit -m "환경세팅 완료"

git remote add origin [깃 주소]

git push origin master

 

Q. Git의 3가지 영역

https://www.youtube.com/watch?v=pkR_ZeMjWGo&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=9 

=> 작업영역 / 인덱스 / 헤드

 

Q. Http 요청방식과 Stateless 방식

https://youtu.be/fLpmG5tIg1c?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=220 

=> 요청시마다 스트림을 연결해서 Data를 주고받는 방식 (반대말 Stateful : 연결이 지속됨)

 

Q. Http 통신의 패킷 스위칭이란?

https://youtu.be/NVjnu4xBdpw?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=423 

=> 패킷단위로 쪼개서 요청순서와 상관없이 서버로 들어오기 때문에 패킷의 헤더와 바디가 필요하다. 여기에서 데이터의 타입을 헤더에 넣는데 그것을 MIME 타입이라고 한다.

 

Q. MIME 타입의 종류

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

 

Q. @Controller와 @RestController의 차이

https://youtu.be/BNiDNAWZn-E?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=88 

=> 컨트롤러는 기본적으로 사용자의 요청을 응답하는 역할을 한다.

  • 사용자의 요청 -> 응답 (HTML파일) : @Controller
  • 사용자의 요청 -> 응답 (data) : @RestController

 

Q. HTTP 상태코드

https://developer.mozilla.org/ko/docs/Web/HTTP/Status

  • 405 : post, put, delete를 브라우저에서 요청할경우 나타나는 에러. 인터넷 브라우저 요청은 무조건 get 요청밖에 할 수 없다.

 

Q. 객체지향에서 변수를 private로 만드는 이유?!

https://youtu.be/Fd5Rhz0j8QQ?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=55 

=> 그 변수를 바꾸려면 getters와 setters 함수로 바꾼다. (얘는 public임)

 

Q. Get요청에서 RequestParam은 하나씩 매핑하는데 한꺼번에 매핑할 순 없나?

https://youtu.be/Fd5Rhz0j8QQ?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=552 

=> RequestParam 대신 Object를 쓰면 Springboot의 MessageConverter가 알아서 매핑해준다.

cf) 참고로 Get방식으로 데이터를 요청하는 방법은 쿼리스트링밖에 없다.

 

Q. Get요청이 아닐경우(Post, Put, Delete) 요청하는 법?

https://youtu.be/Fd5Rhz0j8QQ?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=984 

Post 요청의 경우 쿼리스트링으로 요청할 수 없고 Body에 담아 보내야한다.

Body의 MIME 타입은 여러개가 있지만 가장 기본적인 것과 많이쓰는것 2개만 알자.

  • application/x-www-form-urlencoded
  • application/json

=> @RequestBody 어노테이션을 통해 Object로 매핑 가능.

 

Q. Get요청은왜 Body를 안쓰고 쿼리스트링을써?

https://hongsii.github.io/2017/08/02/what-is-the-difference-get-and-post/

=> URL에 정보를 표시하기 때문에 특정 페이지를 링크하거나 북마크할 수 있음.

 

Q. Maven을 쓰는 이유?

https://www.youtube.com/watch?v=jtur8oAAXYg&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=16 

=> 프로젝트에 필요한 라이브러리를 쉽게 관리할 수 있다. pom.xml에 기술하기만 하면 끝!

 

Q. lombok을 쓰는 이유?

https://www.youtube.com/watch?v=U3Bq4C-NEDU&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=16 

=> 생성자와 getters, setters를 어노테이션 하나로 퉁칠 수 있다!

 

Q. @Builder 란?

https://youtu.be/U3Bq4C-NEDU?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=805 

=> 여러가지 생성자를 따로 생성하지 않아도 객체를 만들 수 있다. (순서를 안지켜도 상관없다!)

 

Q. yaml이란?

https://www.inflearn.com/questions/16184

=> json 파일보다 훨씬 가벼워서 Spring에서 자주 쓰인다.

 

Q. jsp 파일은 src/main/resources/static 에 넣으면 브라우저가 인식하지 못할까? 

https://youtu.be/U9OnYKiSf4g?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=1024 

=> jsp가 동적인(컴파일) 파일이기 때문이다. html과 img 같은 정적인 파일만 인식할 수 있고 jsp는 src/main/webapp/[yml에서 설정한 prefix] 여야함.

 

Q. 테이블을 만들기 위한 yml 설정?

https://getinthere.tistory.com/20

=> 테이블을 생성하려면 최초에 ddl-auto가 create로 실행한 후 그 뒤엔 update로 바꿔야함. 안그러면 새로 실행할 때마다 기존 테이블을 drop 하고 다시 생성하여 데이터가 다날아간다.

 

Q. 객체를 컬럼으로 두어서 DB 테이블을 생성할 순 없나?

https://youtu.be/MJSMvETSE7E?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=221 

=> @ManyToOne 과 @JoinColumn 을 이용하면 바로 외래키세팅까지 마친 상태로 테이블이 생성된다.

 

Q. JpaRepository의 save() 함수 특징

https://youtu.be/oijoJtiGPhI?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=835 

  • id를 전달하지 않을 경우 데이터를 insert 한다.
  • id를 전달할 경우 해당 id에 대한 데이터가 존재하면 update 한다.
  • id를 전달할 경우 해당 id에 대한 데이터가 존재하지 않으면 insert 한다.

=> 보통 save() 함수로는insert만 하고 update는 다른 방식으로 구현한다.

 

Q. data Update는 그럼 어떤 방식을 쓰나요?

https://www.youtube.com/watch?v=dDsI1J4QC6g&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=29 

=> 메서드에 @Transactional 어노테이션을 붙여 더티체킹을 통해 data를 변경한다!

(더티체킹의 과정을 잘 정리해주신 이지환님 감사합니다)

 

Q. 예외처리는 어떻게 하나요?

https://www.youtube.com/watch?v=qYxWWWVpJkA&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=31 

=> @RestController와 @ControllerAdvice를 GlobalExceptionHandler클래스에 붙이고 (두 개를 합쳐서 @RestControllerAdvice 로 써도 됨) 특정 예외에대한 처리를 메서드에 @ExceptionHandler를 붙여 예외처리 할 수 있다.

해당 어노테이션이 붙으면 어디에서든 예외가 발생해도 이 클래스에 들어온다!!

 

Q. Get, Post, Put, Delete를 요청하는 방법?

https://youtu.be/gt17FdIl-3w?list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&t=108 

  • Get 요청은 웹브라우저에서 주소를 통해 요청한다.
  • Post 요청은 form 태그 method='post' 로 요청할 수 있다.
    • 하지만 <form> 태그는 Put과 Delete 요청을 할 수 없다. 따라서 Post, Put, Delete를 한꺼번에 할 수 있는 방식을 채택하는 것이 편하다. => 자바스크립트 ajax 요청 + 데이터는 json으로 통일 
    • cf) <form:form> 로 Post, Put, Delete 요청을 할 수도 있다. 하지만 이것보다 위의 방식을 쓰는 편이다.

 

Q. 스프링 컨트롤러의 파싱 전략?

https://getinthere.tistory.com/24?category=884180 

  • key=value 형태의 데이터일 경우 : Spring이 데이터를 자동으로 파싱하여 변수에 담아준다.
  • key=value 형태의 데이터가 아닐 경우 (예를들어 json 데이터나 일반 text데이터일 경우
    1. @RequestBody 어노테이션을 붙인다.
    2. MessageConverter 클래스를 구현한 Jackson 라이브러리가 발동한다.
    3. json 데이터를 자바 오브젝트로 파싱하여 받아준다.

 

Q. Ajax를 사용하는 이유?

  1. 요청에 대한 응답을 html이 아니라 data(json)를 받기 위해서.
    • 웹 브라우저는 반드시 html을 리턴한다. 하지만 앱은 화면이 내장되어 있기 때문에 data만 받는다. 그럼 웹 서버와 앱 서버 2개를 만들어야하나? -> 너무 귀찮다. 따라서 웹 브라우저도 data(json)을 받아서 통일하자!
  2. 비동기 통신을 하기 위해서.
    • 비동기 통신이란? https://www.youtube.com/watch?v=2PMMQHok3U4&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=37

 

Q. @Service 가 필요한 이유?

  1. 트랜잭션을 관리하기 위해서
  2. 서비스의 의미 때문
    • 예를들어 A가 B에게 10000원을 송금을 한다고 했을때
    • A통장에서 -10000원 B통장에서 +10000원은 동시에 이뤄져야한다. (2개의 트랜잭션이 발생해야함)
    • 둘중 하나라도 실패할 경우 롤백해야한다.
    • 따라서 이 2개의 작업은 하나의 트랙잭션에 묶여있어야 한다.
    • Service를 통해 각각의 트랜잭션을 하나의 트랜잭션으로 묶어서 서비스화 할 수 있다.
    • Service 객체 내 @Transactional 어노테이션을 통해 여러 트랜잭션을 하나로 묶을 수 있다.

=> @Service 어노테이션이 붙으면 스프링이 컴포넌트 스캔 시 해당 클래스를 Bean에 등록한다! => IoC 해줌

 

Q. 트랜잭션이란?

https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h

=> 일이 처리되기 위한 가장 작은 단위. 트랜잭션이 모이면 서비스가 되는것.

=> 트랜잭션은 보통 데이터의 변경이 있을때 쓴다. 데이터의 변경이 다 끝나면 commit을 한다.

 

Q. Read Commit VS Repeatable Read

https://www.youtube.com/watch?v=n1lvzeffDMk&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=43 

Read Commit

  • 트랜잭션이 

 

Q. 스프링의 전통적인 트랜잭션

https://www.youtube.com/watch?v=y4a0X7dS2q8&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=44

 

Q. JPA Naming 전략

기본적으로 JpaRepository<>를 상속받은 Repository 인터페이스에서

1) 간단한 방법

  • User findByUsernameAndPassword(String username, String password);
  • 위의 결과는 SELECT * FROM user WHERE username=?1 AND password=?2; 가 된다.
  • User(타입) = user테이블
  • findBy = SELECT
  • Username = username
  • And = AND
  • Password = password
  • String username = ?1
  • String password = ?2

2) @Query 어노테이션을 쓰는 방법

    • @Query(value="SELECT * FROM user WHERE username=?1 AND password=?2", nativeQuery = true)
      User login(String username, String password);
    • @Query의 value에 sql을 입력하는 방법도 있다.

=> 복잡한 쿼리를 써야할 경우 @Query 어노테이션을 쓰고 간단한것은 1번 방식을 쓴다.

 

Q. XSS 와 CSRF

https://lucete1230-cyberpolice.tistory.com/23

1) XSS

  • 무지성 자바스크립트 공격. (ex. 특정작업을 수억번 반복하는 스크립트를 삽입)
  • 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 XSS에 취약해진다.

2) CSRF

  • 사이트간 요청 위조. 
  • 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격이다.

 

Q. 로그인 시 시큐리티가 세션을 생성하는 과정!

  1. 비밀번호를 검증하기 위해 해당 password가 어떤 해쉬가 되어 가입되었는지 알아야한다.
  2. 로그인 시 스프링이 password를 가로채서 같은 해쉬로 암호화해서 DB의 해쉬와 같은지 확인할것이다.
  3. 내가 할 일은 해당 사용자가 DB에 존재하는지만 알려주면 된다.
  4. UserDetailsService의 loadUserByUsername 함수로 해당 username의 존재 여부를 판별한다.
  5. 판별된 사용자의 정보를 UserDetails 타입으로 전달한다.
  6. 컨트롤러에서 파라미터에 @AuthenticationPrincipal PrincipalDetail principal 를 넣고 세션에 접근할 수 있다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함