반응형

RequestEntity

springframework에서 제공하는 HttpEntity 의 상속클래스.

url 요청을 보낼 때 사용. responseEntity랑 짝꿍임

header, body, method, url, type을 생성자 파라미터로 넘길 수 있다. 

 

RequestEntity 사용 예시

//header 생성
HttpHeaders headers = new HttpHeaders();
headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);
headers.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");

//url 생성
URI url = URI.create("https://https://mchch.tistory.com/");

//requestEntity 생성(방법1)
//header, method, url 을 파라미터로 하여 생성자 호출
RequestEntity<String> req1 = new RequestEntity<>(headers, HttpMethod.GET, url);

//body 생성
String body = "test"

//requestEntity 생성(방법2)
RequestEntity<String> req2 = RequestEntity.post(new URI("https://https://mchch.tistory.com/"))
                                          .accept(MediaType.APPLICATION_JSON)
                                          .body(body);

 


RestTemplate

exchange 메소드를 사용해서 http 요청을 보내고

ResponseEntity 객체를 return 받는다

url, method, requestEntity, responseType 을 생성자 파라미터로 넘길 수 있다. 

 

RestTemplate 의 exchange 사용 예시

RestTemplate restTemplate = new RestTemplate();

//RequestEntity와 responseType을 파라미터로 명시함
//ResponseEntity를 리턴받음
ResponseEntity<String> res = restTemplate.exchange(req, String.class);

 


ResponseEntity

springframework에서 제공하는 HttpEntity 의 상속클래스.

url 요청에 응답할 때 사용

body, header, status를 생성자 파라미터로 넘길 수 있다. 

 

ResponseEntity 사용 예시 1

RestTemplate template = new RestTemplate();
//getForEntity : 요청한 URL 주소로 HTTP GET 요청을 보내고,  ResponseEntity를 반환받음
ResponseEntity<String> entity = template.getForEntity("https://example.com", String.class);

//body 추출
String body = entity.getBody();
//헤더부의 contentType 추출
MediaType contentType = entity.getHeaders().getContentType();
//statusCode 추출
HttpStatus statusCode = entity.getStatusCode();

 

 

ResponseEntity 사용 예시 2

 

response Entity를 API url 호출에 대한 응답으로 사용할 수도 있음

//응답 message, 상태코드를 담은 response entity 생성
ResponseEntity<> response1 = new ResponseEntity<>("success", HttpStatus.OK);

//헤더 생성
MultiValueMap<String, String> header = new LinkedMultiValueMap<>();
header.add("Accept", MediaType.APPLICATION_JSON_VALUE);
header.add("Content-Type", MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8");

//응답 헤더, 상태코드를 담은 response entity 생성
ResponseEntity<> response2 = new ResponseEntity<>(header,  HttpStatus.SERVICE_UNAVAILABLE);

//상태코드는 필수
ResponseEntity<> response3 = new ResponseEntity<>(HttpStatus.OK);



///////////////////////////API 호출, ResponseEntity반환 예시//////////////////

public ResponseEntity<?> Download(String type, String category){
	try{
		return new ResponseEntity<>("성공", HttpStatus.OK);
	}catch(NullPointerException e){
		return new ResponseEntity<>("데이터가 없습니다.", HttpStatus.SERVICE_UNAVAILABLE);
	}	
}
반응형
반응형

LocalDateTime 기본으로 적용되는 날짜표시 포맷

2021-07-06T14:32:27.002333

저 T는 날짜 뒤에 시간이 온다는 것을 알려주는 ISO 날짜 형식이라고 함..

저 T를 포함한.. 밀리세컨드등이 너무 거슬려서... LocalDateTime format을 바꾸려고 함..

 


LocalDateTime의 format을 지정해주는 기본 형식

String dateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

 


  • BaseTimeEntity 원래 코드
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}
  • DB 컬럼 Data Type : DATETIME

 

 

변수에 바로 대입해봤는데..

@CreatedDate
private String createdDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));

@LastModifiedDate
private String modifiedDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
  • DB 컬럼 Data Type : VARCHAR 으로 변경

 

기존에 나오던 거랑은 다른데 내가 넣은 형식이 적용이 안 되고 

마음대로 이렇게 나와버려.. 정말웃겨 ...

21. 7. 6. 오후 4:08

 


Entity Listen을 이용한 BaseTimeEntity 코드

아래와 같이 Entity Listener를  사용하니 원하는 날짜값이 원하는 형식대로 적용되었다.

  • DB 컬럼 Data Type : VARCHAR
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {


    @CreatedDate
    private String createdDate;

    @LastModifiedDate
    private String modifiedDate;

    @PrePersist
    public void onPrePersist(){
        this.createdDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
        this.modifiedDate = this.createdDate;
    }

    @PreUpdate
    public void onPreUpdate(){
    this.modifiedDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
    }

}

 

  • @PrePersist : 엔티티 insert 이전 실행
  • @PreUpdate : 엔티티 update 이전 실행

 


ISO 날짜 형식 참고

 

[ISO] ISO 8601 개념

ISO 날짜 형식이란? 정식 명칭 Date elements and interchange formats - Information interchange - Representation of dates and times 미쳤다.. 현재 제일 최신 버전 ISO 8601 구버전 IS..

java119.tistory.com

 

format 변경 참고

 

JPA 생성 일시 , 변경 일시 format 변경 하는 부분 정리

Auditing을 이용해서 공통으로 등록일과 수정일을 가져와 사용하는 형태로 만들면서 DB 쪽 설계가 char(14) 형태로 나왔다. 이 부분에 대해 얘기를 하였으나 기존 시스템과의 연계 때문에 어쩔수 없

kimseungjae.tistory.com

 

Entity Listener 참고

 

데이터 변경 알림 - @EntityListeners

spring 의 data-jpa 사용시 데이터 변경시 알림을 받는 방법이 있다. EntityListener 클래스를 만들고 public class DataDtoListener { @PostLoad public void postLoad(DataDto dto) { log.info("post load: {}",..

erim1005.tistory.com

 

반응형
반응형

2021.1.2 Community Edition 사용


1. 오른쪽 상단 Application > Edit Configurations

 

2. Modify options > Add VM options

 

3. VM options란이 생성되면 

-Dspring.profiles.active='profile이름' 입력

 

Apply하고 OK, start 하면 로그에 적용된 profile이 보인당

반응형
반응형

1. spring 프로젝트 생성

https://start.spring.io/

이 링크에서 아래와 같이 선택하여 Spring 프로젝트를 생성

 

  • Maven / Gradle : 필요한 라이브러리를 땡겨오거나 빌드 라이프사이클을 관리한다.
  • Spring Boot 버전 선택 : SNAPSHOT은 만들고 있는 버전이므로 완성된 버전을 선택
  • Dependencies : 라이브러리 선택
  • Thymeleaf : HTML 템플릿 엔진
  • Spring Web : tomcat을 포함함

GENERATE를 누르면 내가 지정한 이름으로 zip파일이 다운로드 된다.

압축 파일을 풀고 진행


2. Intellij 다운 및 열기

https://www.jetbrains.com/ko-kr/idea/download/#section=windows

community 버전으로 설치 

설치 완료 후 Intellij를 열고 Open을 눌러 프로젝트 열기 

build.gradle 선택하여 OK > Open as Project > Trust Project

하면 프로젝트가 열린다

창 밑의 바에서 sync 작업이 열심히 진행중이니 다 될때까지 기다린다.  

기다리지 않고 run을 누르면

여기서 수동으로 configuration을 자꾸 하라고 뜨게되니 완료될 때까지 기다려야함.

 

터미널이 안 보이는 경우 아래 버튼을 이것저것 눌러보자 

 

 

완료 후 src > main > java > 밑의 Application java 파일을 열어보면

코드 옆에 ▶ 가 자동 생성된다.

눌러보면 실행됨.

run configuration은 sync 작업이 완료되면 자동 생성된다

 

 

실행했을 때 

Could not target platform: 'Java SE 11' using tool chain: 'JDK 8 (1.8)'. 

가 뜨는 경우

spring 프로젝트를 java 11 버전으로 만들어놓고

시스템엔 8버전이 있어서 11을 못 찾아서 그렇슴


3. JAVA 11 설치 및 세팅

https://www.oracle.com/kr/java/technologies/javase-jdk11-downloads.html

다운로드 후 . . .

내 PC > 우클릭 속성 >

고급 시스템 설정 > 환경변수 >

편집을 눌러 JAVA_HOME 시스템 변수를 jdk-11로 맞춰주자

 

3-1  Intellij Project Structure 세팅

Ctrl + Alt + Shift + S  혹은 좌측 상단 File > Project Structure

Project SDK 를 11version으로 세팅 

 

 

3-2 Gradle 세팅

build.gradle 파일에 11버전으로 표시되어있는지 확인.

 

 

Ctrl + Alt + S 혹은 좌측 상단 File > Settings 

gradle을 검색하여 gradle 메뉴 클릭

  • Gradle JVM  : JAVA_HOME 11version으로 선택
  • Build and rung using & Rung tests using : Intellij 로 하면 조금 더 실행속도가 빠르다고 한다.

 

 


실행

반응형
반응형

페이지 이동시마다 적절하게 알림창이 뜨는 로직이 뭔지 알아보다가..

Spring Boot의 Interceptor를 이용하여 특정 url 진입 시에 특정 작업을 수행하도록 설정할 수 있다는 것..

모든 내용은 아래를 참고하였음..

elfinlas.github.io/2017/12/28/SpringBootInterceptor/

 

Spring Boot에서 Interceptor 사용하기

인터셉터?Spring 또는 Spring Boot 프레임워크로 웹 어플리케이션을 개발하다 보면 아래와 같은 요구사항이 생기게 됩니다. 특정 url 진입 시 로그인이 된(인가된) 사용자가 접근을 해야 함 특정 url 진

elfinlas.github.io

 

내가 작업한 프로젝트 기준으로 작성해보자면

1. HandlerInterceptorAdapter를 상속

이 클래스에 prehandle, posthandle, aftercomplete가 선언되어 있음

preHandle 메소드에 컨트롤러 실행 직전에 실행될 동작이 있음

내 프로젝트에서는 쿠키를 검사해서 알림창을 띄우고 로그인으로 보낸다든지.. 페이지에 대한 권한을 검사한다든지 하는 동작이 있음.

 

2. WebMvcConfigurer 를 상속

addInterceptors 메소드를 구현함

addInterceptor : 등록할 인터셉터 설정

addPathPatterns : 적용할 url 패턴 설정

excludePathPatterns : 인터셉터를 제외할 url 패턴 등록 

 

반응형
반응형

라이브러리에 jar을 추가하려고 ... 했더니 lib 디렉토리도 못찾고...

Maven Dependencies에도 수동으로 paste로 추가하려 했더니 안 됨... ㅠ ㅠ 

Maven의 경우 pom에서 의존성관리를 한다고 함 ! 그래서 pom.xml에서 추가해주면 된다고 함

 

1. pom.xml

dependencies 밑에 이렇게 추가해주었음 

 

<groupId>임의의 이름</groupId>

<artifactId>버전 지우고 jar 파일명</artifactId>

<version>버전 </version>

 

2. 추가 후 저장하니까 에러가 뜨는거임.. 그래서 저 표시된 폴더에 jar파일을 수동으로 추가해줌 

추가된 dependency 내용을 지웠다가 다시 적고 저장하니까 이제 됨~!~!~! 

반응형
반응형

JSP Form에서 VO가 여러개로, 즉 list로  넘기고 controller에서 받아야 하는 경우

List를 사용하면 됨

 

1. VO객체

BoardVo 클래스 안에 List<BoardVO>를 선언하고 getter와 setter도 만들었음!

public class BoardVo {
	
	private String 	boardType;
	private int 	boardNum;
	private String 	boardTitle;
	private String 	boardComment;
	private String 	creator;
	private String	modifier;
	private int totalCnt;

	
	private List<BoardVo> boardVoList;
	

	
	public List<BoardVo> getBoardVoList() {
		return boardVoList;
	}
	public void setBoardVoList(List<BoardVo> boardVoList) {
		this.boardVoList = boardVoList;
	}
	
	

 

2. JSP의 Form 

name은  List객체이름[index].property 이름 

<form:form commandName="boardVo" class="boardWrite" action="/board/boardWriteAction.do">
		<select name="boardVoList[0].boardType" >
				<c:forEach items="${codeList}" var="list">
				<option value="${list.codeId}">${list.codeName}</option>
				</c:forEach>
		</select>
 <input name="boardVoList[0].boardTitle" type="text" size="50" value="${board.boardTitle}"  maxlength="24">

 

반응형

 

 

3. Controller

파라미터를 전달받을땐 List가 아닌 Vo로 받음

//글등록 수행
	@RequestMapping(value = "/board/boardWriteAction.do", method = RequestMethod.POST)
	@ResponseBody
	public String boardWriteAction(Locale locale, BoardVo boardVo) throws Exception{
	
		
		HashMap<String, String> result = new HashMap<String, String>();
		CommonUtil commonUtil = new CommonUtil();
		int resultCnt = 0;
		
		System.out.println(boardVo.getBoardVoList().get(0).getBoardType());
		System.out.println(boardVo.getBoardVoList().get(0).getBoardTitle());
		System.out.println(boardVo.getBoardVoList().get(0).getCreator());
		
		
		resultCnt=boardService.boardInsert(boardVo);

List에 담긴 값(프로퍼티) 호출 시에는

Vo이름.get리스트이름().get(index).get프로퍼티()

 

4. Service Impl

List를 호출할 때는 vo이름.getlist이름().get(인덱스) 해서 사용하면 됨!

@Override
	public int boardInsert(BoardVo boardVo) throws Exception {
		
		int[] results= new int[boardVo.getBoardVoList().size()];
		int result=1;
		
		for(int i=0; i<boardVo.getBoardVoList().size();i++) {
			results[i]=boardDao.boardInsert(boardVo.getBoardVoList().get(i));

			result *= results[i];
		}
		
		return result;
	}
반응형
반응형

메소드에 @ResponseBody를 추가해주고,

이런식으로 script를 포함한 string을 return 해주면 댐

반응형
반응형

 

spring 프레임 워크 사용

위와 같이 컨트롤러에서 update 실행하고 콜백함수도 정상값, DB업데이트도 되는데

자꾸 에러로 넘어가서 수정실패가 뜨는거임 ㅠ 

위는 jsp 쪽 ajax 코드.

error와 success의 기준이 뭘까..

DB 업데이트는 되는데 error 가 뜨는경우 리턴되는 dataType이 맞지 않아 그렇다고 함.

컨트롤러에서 콘솔로 찍힌 값을 보면 

JSON이 맞는데

return 할 때 문제가 있었던 거임 

@ResponseBody 를 붙이지 않아서 그렇슴.

 

@ResponseBody * return 값에 prefix와 suffix가 붙지 않음
* ajax 호출 시 정상적인 json 데이터 반환을 위해 사용함

 

반응형
반응형

contextPath

EL 표현식 사용 시 ${pageContext.request.contextPath}
JSP에서 스크립트 사용 시 <%=request.getContextPath() %>

프로젝트 Path만 가져온다

실제 주소 예시 가져오는 값
http://localhost:8080/mvcMain/write.do /mvcMain
https://localhost:8080/card/main.do /card

 

requestURL

EL 표현식 사용 시 ${pageContext.request.requestURL}
JSP에서 스크립트 사용 시 <%=request.getRequestURL() %>

프로젝트 + 파일경로 
WEB-INF의 실제 JSP 경로를 가져옴

실제 주소 예시 가져오는 값
http://localhost:8080/mvcMain/write.do http://localhost:8080/mvcMain/WEB-INF/views/write.jsp
https://localhost:8080/card/main.do http://localhost:8080/card/WEB-INF/views/MainPage.jsp

 

requestURI

EL 표현식 사용 시 ${pageContext.request.requestURI}
JSP에서 스크립트 사용 시 <%=request.getRequestURI() %>

localhost뒤에 프로젝트 이름부터 끝까지 가져옴

실제 주소 예시 가져오는 값
http://localhost:8080/mvcMain/write.do mvcMain/WEB-INF/views/write.jsp
https://localhost:8080/card/main.do card/WEB-INF/views/MainPage.jsp
반응형

+ Recent posts