

□ 내장 톰켓은 실제 톰캣보다 서버가 좋지 않음
-> 테스트용으로만 사용 ※ 절대 외부로 서버돌리지 않을 것 (사용자 10명 미만일때)



□ port, encoding, jsp, database, mybatis, mapper location, alias-package, logging-level, connection pool(default) 등등-> 기존 spring 프로젝트에서 srvlret, .xml 등에서 설정 및 라이브러리 추가하는걸
□ spring boot 에서는 application.properties 하나로 해결할 수 있음

□ cross domain issue - [CORS] : 서로 다른 도메인(서버)에 있는 자바스크립트와 서버 간의 통신을 제한한다.

※ sout : 어떤 클래스의 몇번째에 문장에 오류가 떴다고 알려주지않음
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
<- 위험 : 로그양 적음 | 사소한 : 로그양 많음 ->

□ 03_Logger : application.properties -> logging.level.root=info
□ log레벨을 info로 잡았기 때문에 info 보다 덜 중요한 debug,trace 등은 찍히지 않는다.
□ application.properties 확인 가능
Spring Boot 는 기본적으로 jsp를 지원하지 않음
그래서 jsp 를 사용하기 위해서는 아래의 라이브러리 추가 및 설정이 필요
<!-- jstl -->
<!-- BOOT 에서는 일부 라이브러리에 대해서 버전 관리를 지원한다. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- jsp -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>9.0.85</version>
</dependency>
□ application.properties 추가
jsp(prefix,suffix)
spring.mvc.view.prefix=/views/
spring.mvc.view.suffix=.jsp
rAttr.addFlashAttribute("msg", msg);
- session 에 데이터 저장 후 사용즉시 지운다. -
□ @Transaction(noRollbackFor=Exception.class) 특정 예외 발생 시 Rollback 처리 하지 않음.
□ @Transaction(rollbackFor=Exception.class) 특정 예외 발생 시 강제로 Rollback
@Transactional 사용 시 try-catch 를 사용하면 자동 롤백이 되지 않음
그래서 예외처리를 스프링에서는 web.xml 를 통해서 특정 에러나 에러코드 발생 시 특정한 요청이나 페이지로 보내는 방식을 사용한다.
그런데 BOOT는 web.xml 이 존재하지 않는다.
□ BOOT 에서는 ErrorController Interface 를 활용한다.
@Transactional(rollbackFor = Exception.class) : 모든 예외에 대해서 롤백처리 (기본값)
□ isolation.READ_COMMITED : (기본) 다른 트랜잭션에서 커밋된 내용만 읽을 수 있다.
□ isolation.READ_UNCOMMITED : 다른 트랜젝션에서 커밋되지 않은 데이터도 읽을 수 있다.
□ isolation.REATABLE_READ : 조회중인 데이터를 다른 트랜젝션에서 UPDATE 못하도록 막는다. -> 중요한 계약내용,정보
□ isolationSERIALIZABLE : 한 트랜젝션 내용이 커밋될때 까지 다른 트랜젝션은 CRUD 불가
□ pool를 가지고 있는 커넥션 갯수 (많으면 많을수록 초기 속도가 느려짐)
□ 프젝할때 1로 줄여놓고 사용해라 사용하는 인원이 많아짐
spring.datasource.hikari.maximum-pool-size=10
□ 커넥션을 요청하고 기다리는 시간(ms)
□ 이 시간이 넘어가면 SQLException을 발생 - 30초
spring.datasource.hikari.connection-timeout=30000
□ 아무것도 하지 않고 놀고 있는 커넥션을 기다려 주는 시간(ms) - 10분
□ 이후 폐기처리 한다.
spring.datasource.hikari.idle-timeout=600000
□ 커넥션 최대 유지 시간 - 30분
□ 30분이 지났다고 바로 폐기 하는건 아님, 작업이 끝나면 바로 폐기 한다.
spring.datasource.hikari.max-lifetime=1800000
@Autowired BoardDAO dao; // 필드주입 -> 변수를 통해서 객체를 참조해 오기 때문에
위의 필드 주입은 사용을 권고하고 있지 않다.
□ 이유 1 : final 을 붙여 불변성을 보장할 수 없다. ( 큰 이유는 아님 )
□ 이유 2 : 객체간 순환 참조를 방지 할 수 없다.
※ 순환 참조 란? : 서로가 서로를 보고 있으면서 상대의 변화가 생길때마다 나의 변화가 생기면 무한으로 서로의 변화를 감지해야 한다.
□ 순환 참조
우리가 그동안 Controller -> Service -> Dao 순으로 Autowired 를 통해 참조하였다.
이런 단방향은 문제되지 않음
□ 하지만 Service가 여러개이고, 이것들이 서로가 서로를 호출할 경우 문제가 발생할 수 있다.
MainService 가 MemberService 를 Autowired 했는데. MemberService 도 MainService를 Autowired 한 경우
-> 이 경우 Autowired를 사용하는 경우, 프로그램이 실제로 문제가 발생하는 상황(stack over flow)이 되서야 순환참조를 알 수 있다.
□ 그래서 순수 자바를 사용해서 주입하면 컴파일 단계에서 순환 참조를 알아낼 수 있다.
-> 실수의 조기 발견이 가능
※ 또는 Lombok 의 @RequiredArgConstructor 를 대신 사용해도 된다.
private final BoardService service;
□ 필드 주입
public BoardController(BoardService service) {
this.service = service;
}
/* 2개를 받을 경우
private final BoardService bbs_service; //생성자 주입
private final MemberService mem_service; //생성자 주입
public BoardService(BoardService bbs_service, MemberService mem_service) {
this.bbs_service = bbs_service;
this.mem_service = mem_service;
}*/
/* 2개 이상일 경우는 @Autowired 를 붙여줘야한다.
* @Autowired A a;
* @Autowired B b;
* @Autowired C c;
*
* public BoardService(A a, B b, C c) {
* this.a = a;
* this.b = b;
* this.c = c;
* }
*/
Representational State Transfer
클라이언트와 서버 요소를 엄격하게 구분함
하나의 서버로 다양한 플랫폼의 클라이언트 대응 가능
url 형태로 요청을 명료화 할 수 있음
/detail?lecture=java&idx=15 VS /detail/java/15
상황이나 요청 데이터에 따라 요청 방식을 선택 하면 된다
※ 일반적으로 select만 요청 insert,update 는 요청하지 않음
※ Ajax로 많이 이용함
※ 서버와 프론트의 구분이 확실하게 나눠져있음

@RestController 를 사용하면 모든 반환이 Response 객체에 쓰여지게 되므로 @ResponseBody 를 사용할 필요가 없다
※ 다만 view 로 페이지 이동이 불가능하다
※ modelandview를 활용하면 RestController 에서도 페이지 이동이 가능함
@GetMapping(value="/")
public ModelAndView home() {
// modelandview를 활용하면 RestController 에서도 페이지 이동이 가능함
logger.info("메인페이지 요청");
return new ModelAndView("home");
}
GET : 특정 데이터를 조회할 경우 사용
POST : 특정 데이터 입력을 요청할 경우
DELETE : 특정 데이터 삭제 요청 경우
PUT : 특정 데이터 수정 요청
PATCH : 특정 데이터 수정(일부)
simple : {name:'kim', age:35}
simple : {name:'kim',scores:[10,20,30]}
complex : {name:'kim',scores:[{subject:'java',score:10},{subject:'db',score:20}]}
$.ajax({
type:'post', //★ POST로 보내야 한다. ★
url:'./rest/complex.ajax',
data:JSON.stringify(param), // ★ JSON을 문자열로 변환해서 보내야 한다. ★
dataType:'JSON',
contentType:'application/json; charset=utf-8', //★ contentType 명시 ★
success:function(data){
console.log(data);
},
error:function(e){
console.log(e);
}
});
★ 파라메터를 받을때 @RequestBody 로 받아야 한다. ★
@RequestMapping(value="/rest/complex.ajax")
public Map<String, Object> complex(@RequestBody Map<String, Object> param){
logger.info("param : {} ",param);
Map<String, Object> values = (Map<String, Object>) param.get("values");
logger.info("valuse : "+values); // {name=숫자넣기, num=[1, 2, 3, 4, 5]}
String name = (String) values.get("name");
logger.info("name : "+name); // name : 숫자넣기
List<Integer> num = (List<Integer>) values.get("num");
logger.info("num : "+num); // num : [1, 2, 3, 4, 5]
Map<String, Object> map = new HashMap<String, Object>();
map.put("success", true);
return map;
}
는?
단점 : 내장 톰켓은 실제 톰캣보다 서버가 좋지 않음 / 테스트용으로만 사용 ※ 절대 외부로 서버돌리지 않을 것 (사용자 10명 미만일때) 수용인원이 적음
Spring Boot는 xml 설정으로 힘들었던 부분이 java 파일로 설정한다는 특징이 있
습니다. boot에는 없어진 Spring 사용시에 설정 했던 xml 파일 3가지를 말해주세요
1) servlet-context.xml 요청 할때
2) root-context.xml
3) web.xml 요청 시 프로그렘이 시작 할때
SpringBoot 의 특징 3가지 (총 5가지 있습니다.)
3-1 model 과 modelandview 의 차이점
Type과 Packaging을 뭐로 설정했는지 적어주세요
5-1 Restful Service 특징
※ modelandview를 활용하면 RestController 에서도 페이지 이동이 가능함
하는것을 의미한다.
※ 해결 방안 : @crossOrigin 사용 클래스 위에 있으면 해당 매서드들은 모두 허용
매서드 위에 있으며 해당 매서드만 허용
어야한다. 여기서 jasper 라이브러리에서 들어갈 톰캣 버전은 어떤 버전이 들어가
야 하는가?
프로젝트 생성시 Mybatis 연동에 필요한 라이브러리는?
⁃ - Mybatis Framework
⁃ - MaridDB Driver
DB 접속 정보를 입력하는 파일은? ( 설정 정보들 )
동적쿼리란?
⁃ - 상황에 따라 SQL문장이 변경되는 것
동적쿼리에서 사용되는 태그 3가지
※ 해결방안 : ErrorController Interface 를 활용
한 설명을 설명하시오.