티스토리 뷰
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데이터일 경우
- @RequestBody 어노테이션을 붙인다.
- MessageConverter 클래스를 구현한 Jackson 라이브러리가 발동한다.
- json 데이터를 자바 오브젝트로 파싱하여 받아준다.
Q. Ajax를 사용하는 이유?
- 요청에 대한 응답을 html이 아니라 data(json)를 받기 위해서.
- 웹 브라우저는 반드시 html을 리턴한다. 하지만 앱은 화면이 내장되어 있기 때문에 data만 받는다. 그럼 웹 서버와 앱 서버 2개를 만들어야하나? -> 너무 귀찮다. 따라서 웹 브라우저도 data(json)을 받아서 통일하자!
- 비동기 통신을 하기 위해서.
- 비동기 통신이란? https://www.youtube.com/watch?v=2PMMQHok3U4&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=37
Q. @Service 가 필요한 이유?
- 트랜잭션을 관리하기 위해서
- 서비스의 의미 때문
- 예를들어 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. 로그인 시 시큐리티가 세션을 생성하는 과정!
- 비밀번호를 검증하기 위해 해당 password가 어떤 해쉬가 되어 가입되었는지 알아야한다.
- 로그인 시 스프링이 password를 가로채서 같은 해쉬로 암호화해서 DB의 해쉬와 같은지 확인할것이다.
- 내가 할 일은 해당 사용자가 DB에 존재하는지만 알려주면 된다.
- UserDetailsService의 loadUserByUsername 함수로 해당 username의 존재 여부를 판별한다.
- 판별된 사용자의 정보를 UserDetails 타입으로 전달한다.
- 컨트롤러에서 파라미터에 @AuthenticationPrincipal PrincipalDetail principal 를 넣고 세션에 접근할 수 있다.
'Web 개발' 카테고리의 다른 글
[Web] Spring Basic 2 - 스프링 웹 개발 기초 (0) | 2021.12.09 |
---|---|
[Web] Spring Basic 1 - 프로젝트 환경설정 (0) | 2021.12.09 |
[Web] Spring Boot with JPA (0-6) response하는 법 (0) | 2021.08.29 |
[Web] Spring Boot with JPA (0-5) ApplicationContext (0) | 2021.08.29 |
[Web] Spring Boot with JPA (0-5) FrontController와 RequestDispatcher 그리고 DispatcherServlet. (0) | 2021.08.28 |
- Total
- Today
- Yesterday
- 백트래킹
- Spring Boot
- S3
- S2
- DFS
- BFS
- 그리디
- SWEA
- 자바
- react
- 현꾸라지
- 우선순위큐
- 다익스트라
- 백준
- 시뮬레이션
- 객체지향
- g4
- Spring
- 구현
- 문자열
- PriorityQueue
- G5
- 리액트
- laugh4mile
- react native
- 알고리즘
- java
- 코딩새내기
- map
- 리액트 네이티브
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |