[Spring Boot]

KDH59·2024년 5월 16일

[SPRING BOOT]

목록 보기
1/7
post-thumbnail

Spring Boot

Spring Boot 특징

  • SPRING BOOT 는 SPRING 을 보다 편리하게 사용 할 수 있도록 하기 위한 도구
  • 복잡했던 Xml 설정이 상당 부분 사라지거나 JAVA 코드로 작성 하도록 변경

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

□ application.properties

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

□ spring boot 에서는 application.properties 하나로 해결할 수 있음

CrossOrigin

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

  • 해결 방안 : 서버에서 요청을 허용하도록 해줘야 한다. -> @CrossOrigin
    - @CrossOrigin 이 클래스 위에 선언되어 있으면 해당 매서드들은 모두 허용 된다. (보안성 취약)
    - @CrossOrigin 이 매서드 위에 선언되어 있으면 해당 매서들만 허용 한다.
    - @CrossOrigin(origins={"{허용 url1","허용 url2"})과 같이 특정 url 만 허용할 수 도 있다.

Logger 적용

※ 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 사용하는법

  • 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
     
     

Dynamic SQL ( 동적쿼리 )

  • 동적 쿼리는 상황에 따라 SQL 문장이 변경 되는 것을 의미 한다.
    □ 동적 쿼리 문장에는 주로 if 문이 사용 된다.
    □ 이 외에도 trim 이나 for each 등의 문이 있다.

redirect 는 response 객체

  • 그래서 Model 에 데이터를 넣어서 보낼 수 없다.
  • RedirectAttributes rAttr 매서드 사용
 rAttr.addFlashAttribute("msg", msg); 
 - session 에 데이터 저장 후 사용즉시 지운다. -

Transaction

□ @Transaction(noRollbackFor=Exception.class) 특정 예외 발생 시 Rollback 처리 하지 않음.
□ @Transaction(rollbackFor=Exception.class) 특정 예외 발생 시 강제로 Rollback

@Transactional 사용 시 try-catch 를 사용 불가

  • @Transactional 사용 시 try-catch 를 사용하면 자동 롤백이 되지 않음

  • 그래서 예외처리를 스프링에서는 web.xml 를 통해서 특정 에러나 에러코드 발생 시 특정한 요청이나 페이지로 보내는 방식을 사용한다.

  • 그런데 BOOTweb.xml 이 존재하지 않는다.

□ BOOT 에서는 ErrorController Interface 를 활용한다.

@Transactional(rollbackFor = Exception.class)

@Transactional(rollbackFor = Exception.class) : 모든 예외에 대해서 롤백처리 (기본값)

□ isolation.READ_COMMITED : (기본) 다른 트랜잭션에서 커밋된 내용만 읽을 수 있다.
□ isolation.READ_UNCOMMITED : 다른 트랜젝션에서 커밋되지 않은 데이터도 읽을 수 있다.
□ isolation.REATABLE_READ : 조회중인 데이터를 다른 트랜젝션에서 UPDATE 못하도록 막는다. -> 중요한 계약내용,정보
□ isolationSERIALIZABLE : 한 트랜젝션 내용이 커밋될때 까지 다른 트랜젝션은 CRUD 불가

application.properties / connection pool(default)

□ 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

  • 싱글톤 패턴 : 하나의 객체를 원본영역에 두고, 이것을 바라보도록 만든 구조( 다수의 객체를 불필요하게 만들 필요가 없다.)
@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;
 * }

 */
 

Restful Service

개념

  • Representational State Transfer

  • 클라이언트와 서버 요소를 엄격하게 구분함

  • 하나의 서버로 다양한 플랫폼의 클라이언트 대응 가능

  • url 형태로 요청을 명료화 할 수 있음

  • /detail?lecture=java&idx=15 VS /detail/java/15

  • 상황이나 요청 데이터에 따라 요청 방식을 선택 하면 된다

    ※ 일반적으로 select만 요청 insert,update 는 요청하지 않음
    ※ Ajax로 많이 이용함
    ※ 서버와 프론트의 구분이 확실하게 나눠져있음

JSON


@RestController 를 사용하면 모든 반환이 Response 객체에 쓰여지게 되므로 @ResponseBody 를 사용할 필요가 없다

※ 다만 view 로 페이지 이동이 불가능하다
※ modelandview를 활용하면 RestController 에서도 페이지 이동이 가능함

	@GetMapping(value="/")
public ModelAndView home() { 
// modelandview를 활용하면 RestController 에서도 페이지 이동이 가능함
	logger.info("메인페이지 요청");
	return new ModelAndView("home");
}

method 종류

 GET : 특정 데이터를 조회할 경우 사용
 POST : 특정 데이터 입력을 요청할 경우
 DELETE : 특정 데이터 삭제 요청 경우
 PUT : 특정 데이터 수정 요청
 PATCH : 특정 데이터 수정(일부)
 

복잡한 JSON 전송 방법 ★

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;
}
profile
[JAVA]

1개의 댓글

comment-user-thumbnail
2024년 5월 21일
  1. Spring Boot는 별도의 Tomcat 설치를 안해도 서비스 동작이 가능한데 그 이유
    는?
  • 내장 TOMCAT을 가지고 있기때문이다.
    단점 : 내장 톰켓은 실제 톰캣보다 서버가 좋지 않음 / 테스트용으로만 사용 ※ 절대 외부로 서버돌리지 않을 것 (사용자 10명 미만일때) 수용인원이 적음
  1. Spring Boot는 xml 설정으로 힘들었던 부분이 java 파일로 설정한다는 특징이 있
    습니다. boot에는 없어진 Spring 사용시에 설정 했던 xml 파일 3가지를 말해주세요
    1) servlet-context.xml 요청 할때
    2) root-context.xml
    3) web.xml 요청 시 프로그렘이 시작 할때

  2. SpringBoot 의 특징 3가지 (총 5가지 있습니다.)

  • 복잡했던 .xml 설정이 상당부분 사라지거나 java코드로 작성가능
  • 기본적으로 jsp 지원 안함
  • tomcat 설치 없어도 서비스 작동이 됨 ( 내장 톰켓 사용 )

3-1 model 과 modelandview 의 차이점

  1. Spring starter Project 를 통해서 Project를 생성할 때 Spring때와 맞추기 위해서
    Type과 Packaging을 뭐로 설정했는지 적어주세요
  • Type: Maven
  • Packaging: War
  1. Spring Boot에서 RESTful 웹 서비스를 제공하는 컨트롤러에 사용하는 애노테이션은 무엇입니까?
  • @RestController

5-1 Restful Service 특징

  • 클라이언트와 서버 요소를 엄격하게 구분함
  • 하나의 서버로 다양한 플랫폼의 클라이언트 대응 가능
  • url 형태로 요청을 명료화 할 수 있음
  1. @RestController의 특징은?
  • 모든 반환이 Response 객체에 쓰여지게 되므로 @ResponseBody를 사용하지 않아도 된다.
  • 다만 view 페이지의 이동이 불가능 함
    ※ modelandview를 활용하면 RestController 에서도 페이지 이동이 가능함
  1. CORS란 무엇인가? [cross domain issue]
  • CORS란 서로 다른 도메인(서버)에 있는 자바스크립트와 서버간의 통신을 제한
    하는것을 의미한다.
    ※ 해결 방안 : @crossOrigin 사용 클래스 위에 있으면 해당 매서드들은 모두 허용
    매서드 위에 있으며 해당 매서드만 허용
  1. Spring Boot는 기본적으로 jsp를 지원하지 않기때문에 라이브러리를 추가해 주
    어야한다. 여기서 jasper 라이브러리에서 들어갈 톰캣 버전은 어떤 버전이 들어가
    야 하는가?
  • 9.0.86
  1. 프로젝트 생성시 Mybatis 연동에 필요한 라이브러리는?
    ⁃ - Mybatis Framework
    ⁃ - MaridDB Driver

  2. DB 접속 정보를 입력하는 파일은? ( 설정 정보들 )

  • application.properties
  1. Logger를 SQL 문에 적용할때 필요한 라이브러리는?
  • log4jdbc
  • 설정파일들을 추가해줘야 한다 log4jdbc.properties / logback-spring.xml
  1. 동적쿼리란?
    ⁃ - 상황에 따라 SQL문장이 변경되는 것

  2. 동적쿼리에서 사용되는 태그 3가지

  • 주로 If문이 있고 foreach,where 등등
  1. 동적쿼리에서 set태그의 기능은?
  • 불필요한 ,를 제거 [조건문을 포함시켜 조건이 충족될 때만 SQL 문장에 해당 조건을 추가]
  • 조건부 문장 생성
  1. @Transactional 을 사용하는데 어떤것을 사용하면 자동롤백이 되지 않는다. 이것은 무엇인가?
  • try-catch

※ 해결방안 : ErrorController Interface 를 활용

  1. 트랜잭션의 여러옵션중 rollbackFor가 가장 기본이다. reollbackFor 옵션에 대
    한 설명을 설명하시오.
  • 특정 예외 발생 시 강제로 Rollback
  1. RestController는 기본적으로 view 로 페이지 이동이 불가능 하다. 하지만 페이지 이동을 하도록하는 방법이 있다. 방법을 설명하시오.
  • return new ModelAndView(“jsp이름”)
  1. max-lifetime에 대해 설명하고 기본값을 말해주세요(단위: 분)
  • Connection 의 최대 유지 시간 시간이 지난다고 바로 폐기 하지 않고, 작업이 끝나면 바로 폐기 / 30분
답글 달기