반응형

1. @MappedSuperClass

 

회사 정보를 조회하는 사이트를 구축한다고 해보자.

 

 

회사 테이블에도 생성일, 수정일을 넣어야하고

유저에도 개인정보 수정일, 가입일 (createdDate)를 넣어야하는데

지금은 2개의 테이블이지만 생성/수정일을 몇십개의 테이블에 다 넣어야한다면, 저짓을 겁나많이해야된다.

너무귀찮은일임.

 

@Enttiy
public class Company {
	@Id @GeneratedValue
	private Long id;
    private String name;
    private String address;
    private LocalDateTime createdDate;
    private String createdBy;
    private LocalDateTime updatedDate;
    private String updatedBy;
}

@Entity
public class User {
	@Id @GeneratedValue
	private Long userId;
    private String name;
    private String mobile;
    private String email;
    private LocalDateTime createdDate;
    private String createdBy;
    private LocalDateTime updatedDate;
    private String updatedBy;
}

보기만 해도 토가나온다.

 

이것을 안하기위해서 MappedSuperClass 를 써보자

BaseEntity 라는 이름을 써서 만들어줄것임

@MappedSuperClass
public abstract class BaseEntity {
	private LocalDateTime createdDate;
    private String createdBy;
    private LocalDateTime updatedDate;
    private String updatedBy;
}

주의할점은 abstract 로 작성해야된다는점임.

 

이제 이것을 붙여보면

@Enttiy
public class Company extends BaseEntity {
	@Id @GeneratedValue
	private Long id;
    private String name;
    private String address;
}

@Entity
public class User extends BaseEntity {
	@Id @GeneratedValue
	private Long userId;
    private String name;
    private String mobile;
    private String email;
}

짠~

가독성으로만 따져봐도 중요한 변수만 보임!

 

근데 사이트가 커져서, 회사를 업종별로 select 하고싶어졌다...

별도로 관리를 해줘야한다면? company를 업종별로 나눠야겠지

 

근데, 어짜피 이름 주소 ...등등 기본적인건 다 쓰니까 그대로두고

업종 + 업종별 unique 컬럼들만 쏙쏙 빼서 관리하고싶다면???

 

2.@inherited & @DiscriminatorColumn

 

company 에 pk로 company_id 넣어주고

dtype 이라는 컬럼으로 자식들 구분값 fk로 넣어주는식으로 해야 나중에 select 해올때 dtype 값으로 join 해서 가져오겠지.

 

이것을 JPA로 구현해보자

 

일단 기본이 되는 COMPANY 를 생성

@Enttiy
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Company extends BaseEntity {
	@Id @GeneratedValue
    @Column(name = "COMPANY_ID")
	private Long id;
    private String name;
    private String address;
}

새로보는 애노테이션이 있쥬??

@Inheritance 의 InheritanceType 전략에 따라 다양한 테이블을 만들수있음.

지금만드려는건 join 형태의 테이블이니까 JOIN을 쓰지만, SINGLE_TABLE, TABLE_PER_CLASS 전략이 있는데

다른애들은 테이블통째로 만들어서 별로다.

 

@Inheritance 로 전략을 설정하고

@DiscriminatorColumn으로 부모가 누군지 알려준다. 나대지 못하도록.

글고 부모테이블 (company)에 자식들 구분값을 넣어주는 컬럼을 생성해준다.

DTYPE 이라는 이름으로 자동값으로 생성되는데 이름을 바꿔줘도되지만, 보통은 이걸로 쓰는거같다.

 

그리고 자식을 만들어주자

 

@Entity
@DiscriminatorValue("O")
public class Office extends Company {
	@Id @GeneratedValue
    	private Long officeId;
    
    	private String businessType;
    	private String ceo;
    
}

@Entity
@DiscriminatorValue("S")
public class Store extends Company {
	@Id @GeneratedValue
    	private Long storeId;
    
    	private String businessType;
    	private String cto;
    
}

@Entity
@DiscriminatorValue("R")
public class Restorant extends Company {
	@Id @GeneratedValue
    	private Long restorantId;
    
    	private String businessType;
    	private String chef;
    
}

 

자식은 테이블 따로만들꺼니까 @Entity 달아주고

자식에겐 이름을 지어줘야지.

 

@DiscriminatorValue 로 이름을 지어준다.

이렇게하면 부모의 DTYPE 컬럼에 discriminatorValue로 설정한 문자들이 박히게된다.

 

 

자 여기까지 하면 상속은 왠만한건 다 끝난것같지만? 갑자기 이런녀석도있다.

 

3. @Embedded

 

이녀석도 상속하는녀석인데... 대체 님 뭐임?

 

@MapperSuperClass 형님 어쩔깝쇼??

일단 형님의 특징은 아래와같다.

 

@Entity 로 선언된 엔티티 클래스는 같은 엔티티클래스 혹은 @MapperSuperClass 로 지정된 클래스만 상속이 가능하다.

형님은 부모클래스는 자식클래스에 매핑정보만 제공하는 역할이다.

또한 단독으로 사용되는 일이 없으므로 추상클래스로 사용하는게 좋고

전체 엔티티에서 공통으로 적용하는 정보를 모을때 사용한다

 

그럼 샛병아리 @Embedded 는?

 

@Getter @Setter
@Embeddable
public class Times {
	private LocalDateTime createdDate;
    	private LocalDateTime updatedDate;
}

일단 냅다 만들고

전 쓰여지는 애입니다~ 하는 Embeddable 애노테이션을 달아준다.

 

@Entity
public class User {

	@Id
	@GeneratedValue
	private Long id;
	private String name;

	@Embedded
	private Times times;
}

그리고 쓰는곳에서 변수중에 임베디드 할 녀석을 지정해준다.

이렇게되면 @MappedSuperClass 성님처럼 부모노릇은 못하고 노예처럼 사용되게된다 후후

 

형님은 상속을, 저 햇병아리는 위임을 사용하는것의 차이인데

 

형님은 감히 우리가 사용하진 못한다. 변경할수가없다.

 

하지만 임베디드 햇병아리는 변수값을 변경시키거나 사용할때 용이하다. 한 딱까리 한다.

 

임베디드는 햇병아리답게 사용할때도 좀 복잡하다.

jpql을 쓴다고하면

select u from User u where u.times.createdDate

이렇게 쩜을 겁나찍어줘야됨.

 

하지만 우리 형님은?

 

select u from User u where u.createdDate

직관성좋게 한줄이면 된다.

 

편리함과직관성때문에 조회시에는 형님을, 수정이 필요할때는 임베디드를 사용하면된다.

 

 

 

이해에 도움을 준 블로그 

https://velog.io/@rudwnd33/JPA-MappedSuperclass-vs-Embedded-Type

728x90
반응형

간단한건데 this 가 confirm 안에 들어간다거나 다른 function 안에서 사용되면 인식이 안된다.

 

 

let self = this;

 

그럴땐 별도 변수에 this 담아서 사용!

 

 

 

 

728x90

'FrontEnd > Vue' 카테고리의 다른 글

vue emit 사용법  (0) 2022.08.04
반응형

자식이 부모에게 값전달

 

부모

<template>
  <AgreeContent v-if="obj.text=='agree'" @text-change-agree="agreeMethod"></AgreeContent>
  <ExchangeContent v-if="obj.text=='exchange'"></ExchangeContent>

  <br><hr>
  <button v-on:click="obj.text= (obj.text=='agree'? 'exchange':'agree')"> click me! </button>
  {{obj.text}}
</template>

<script>
import AgreeContent from "@/components/AgreeContent";
import ExchangeContent from "@/components/ExchangeContent";

export default {
  name: 'App',
  components: {
    ExchangeContent,
    AgreeContent
  },
  data() {
    return {
      obj: {
        text: "agree"
      }
    }
  },
  methods: {
    agreeMethod : function(text) {
      this.obj.text = text;
    }
  }
}
</script>

AgreeContent 라는 커스텀 엘리먼트는

obj.text == agree 일때 출력됨.

 

ExchangeContent 라는 커스텀 엘리먼트는 

obj.text == exchange 일때 출력됨.

 

AgreeContent 한테 @text-change-agree 라는 key로 agreeMethod를 보냄

(카멜케이스 안먹힘!!!!!!!!!!!!!!!!!!!!!!!!!!! 꼭 - 포함해서 하도록!!!!!!!!!!!)

 

일단 기본적으로 obj.text == agree로 세팅되어있으므로 <AgreeContent> 컴포넌트만 출력될것임.

 

 

자식1 - AgreeContent 

<template>
 <h2>agree 컴포넌트 입니다</h2>

  <p>agree~~~~</p>
  <button @click="move">excange로 이동~</button>
</template>

<script>
export default {
  name: "AgreeContent",

  methods: {
    move: function() {
      this.$emit('text-change-agree', "exchange");
    }
  }
}

AgreeContent 에서 버튼을 클릭하면 move 라는 메소드가 실행되고

move에서는 emit 을 통해서 text-change-agree 로 exchange를 보냄

 

이때 부모창에서 있는 text-change-agree로 들어와서

 

//부모창 메소드

agreeMethod : function(text) {
      this.obj.text = text;
    }

 이것을 실행하고 부모창의 obj.text == exchange 로 변환되면서

 

//부모창
<AgreeContent v-if="obj.text=='agree'" @textChangeAgree="agreeMethod"></AgreeContent>
<ExchangeContent v-if="obj.text=='exchange'"></ExchangeContent>

AgreeContent 는 안보이고

ExchangeContent 가 보이게됨.

 

 

자식2 - ExchangeContent 

 

<template>
  <h2>Excange 컴포넌트 입니다</h2>

  <p>Excange~~~~</p>
</template>

<script>
export default {
  name: "ExcangeContent",

  methods: {
   
  }
}

얘가 보이게될것임

728x90

'FrontEnd > Vue' 카테고리의 다른 글

function 안의 function 혹은 confirm 안의 this 불러오기  (0) 2022.08.10
반응형

출처 : https://domdom.tistory.com/175

 

[크롤링] 파이썬으로 인스타그램 게시물 크롤링하기 (json)

처음 인스타그램 사이트에 들어가면 로그인창이 나와요. 일단 로그인을 해줍니다! https://www.instagram.com/ 그리고서, 원하는 게시물을 크롤링 하기 위해 게시물을 검색해볼게요. 저는 강아지를 좋

domdom.tistory.com

 

이분 코드로 진행해보았고 사진파일저장 & 엑셀저장까지 추가적으로 개발했다

 

 

 

빠르게 인스타그램 크롤링 하는방법 시작!!

 

1. 파이썬 다운로드

다운로드 url : https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

 

위 경로에 들어가서 파이썬 다운로드

 

다운로드할때 나는 D드라이브 경로로 별도지정해서 다운로드했다.

 

다운로드 끝났으면 CMD 창 (명령프로토콜)에서 확인해야하는데, 시작 바에서 CMD 치면 나온다.

 

파이썬이 잘 다운로드됐나 확인하기위하여 명령어를 입력해본다.

 

phtyon --version

파이썬 버전이 출력되면 정상적으로 된것.

 

 

2. vscode 다운로드

다운로드 URL: https://code.visualstudio.com/download

나는 윈도우 유저라서 시스템인스톨러 64bit 윈도우 용으로 다운받았다.

 

 

3. 인스타그램 로그인

 

1) 로그인 후 F12 버튼 누름

키보드에서 F12 누르면 관리자 창이 뜨는데 name 쪽을 보면 아직 깨끗하다.

 

2) 내가 원하는 태그명 검색

 

태그를 검색하면 주소창이 아래와 같은 형식으로 변경될것이다.

https://www.instagram.com/explore/tags/태그이름/ 

 

3) URL 변경

https://www.instagram.com/explore/tags/태그이름/?a=1

기존 url 에서?a=1 를 붙여서 들어가보면 json 파일 형식이 노출될것임.

 

이때 다시 f12로 들어가보면

?_a=1 이라는 name 이 보이고, 걔를 클릭해보면

Request Header가 존재하는데, 이 창을 유지한 상태로 냅둔다.

 

3. 필요 라이브러리 다운

 

1). cmd (명령 프로토콜)창에서 필요한 라이브러리들 다운받는다.

pip install openpyxl 
pip install requests
pip install datetime

요거 세개가 필요하다.

세줄 써있다고 한꺼번에 입력하지말고 한줄 입력 후 다운받아지면 그다음줄 입력하면된다.

 

4. vscode 실행 & 코드작성

 

1) 원하는 위치에 폴더하나 만들고 vscode를 실행한다. ex) D드라이브에 폴더하나 생성 

 

2) vscode 실행 > 파일 > 폴더열기 

    1.test 폴더를 연다.

 

 신뢰 안내창나오면 신뢰합니다 체크

문서하나 생성해서 test.py 로 py 파일 생성

 

 

정상적으로 생성됐으면 사진 저장할 폴더를 하나 만들어준다.

요 아이콘눌러서 images 라는 이름으로 생성

 

그리고 test.py에 아래 코드를 복붙. test 말고 다른이름으로 해서 생성해도되지만 꼭 .py가 붙어야된다.

 

from pprint import pprint
from openpyxl.workbook.workbook import Workbook
import requests
import json

from datetime import datetime

# 헤더값은 각자의 f12의 내용 참고해서 작성해야됨. 아래 코드의 값과 다를 수 있음.

header = {
    'accept': '*/*',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
    'cookie': 'f12에서 찾아서 넣어야됨 쿠키값',
    'referer': "f12에서 찾아서 넣어야됨",
    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
    'sec-ch-ua-mobile': '?0',
	'sec-ch-ua-platform':'windows',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
    'x-asbd-id': 'f12에서 찾아서 넣어야됨',
    'x-ig-app-id': 'f12에서 찾아서 넣어야됨',
    'x-ig-www-claim': 'f12에서 찾아서 넣어야됨',
    'x-requested-with': 'XMLHttpRequest'
}


dataList = []
URL = 'https://www.instagram.com/explore/tags/태그명/?__a=1' 

# 개수확인용도
pidCount = 0

while(True):

    res = requests.get(URL, headers =header)
    res = res.json()

    if 'next_page' not in res['data']['recent'].keys() or int(res['data']['recent']['next_page']) == 0: break
    max_id = res['data']['recent']['next_max_id'] 

    for n in res['data']['recent']['sections']: 

        for m in ((n['layout_content']['medias'])): 
            # m : 인스타 게시글 1개
            m = m['media']
            data = {} 
            data['pagePk'] = m['code']
            data['URL'] = 'https://www.instagram.com/p/'+ data['pagePk']+"/"
            data['user_name'] = (m['user']['username']) 
            
            # 이미지/동영상 체크
            keys = m.keys()
            if 'carousel_media' in keys:
                data['image'] = (m['carousel_media'])
            else:
                data['image'] = [{'image_versions2':{"candidates":[{'url':'동영상업로드'}]}}]


            dataList.append(data)
            pidCount = pidCount+1
            pprint (pidCount) # 개수확인용도

    URL = 'https://www.instagram.com/explore/tags/'+'태그명'+'/?__a=1&max_id='+max_id



# 엑셀 다운로드 및 이미지 저장

from openpyxl import Workbook
wb = Workbook()
ws = wb.active


#시트생성
sheet1 = wb['Sheet']
sheet1.title = '수집 데이터'
sheet1['A1'] = '아이디'
sheet1['B1'] = 'URL'
sheet1['C1'] = '이미지'

sheetIndex = 2

for data in dataList:
    sheet1['A'+str(sheetIndex)] = data['user_name']
    sheet1['B'+str(sheetIndex)] = data['URL']
     
    # 이미지링크 엑셀에 저장
    for imgUrl in data['image']:

        url = imgUrl['image_versions2']['candidates'][0]['url']
        sheet1['C'+str(sheetIndex)] = url
        
        # 이미지 폴더에 저장
        if not os.path.exists("./images/"+data['user_name']):
            os.mkdir("./images/"+data['user_name'])

        if url not in '동영상업로드':
            r = requests.get(url)
            file = open("./images/"+data['user_name']+'/'+data['user_name']+str(sheetIndex)+".jpg","wb")
            file.write(r.content)
            file.close()

        sheetIndex = sheetIndex+1



wb.save('./test1.xlsx')

 

 

헤더값은 아까 f12에서 구한 쿠키값..등등 제목보고 알아서 넣고

아까 이미지저장용 폴더를 images 라고 만들었는데, 다른 이름으로 생성하고싶으면 바꿔도된다. 하지만

위 코드에서 ./images 로 써져잇는 부분을 동일하게 꼭 바꿔줘야된다

 

최종적으로 저장되는 엑셀파일 이름도 wb.save('./test1.xlsx') 라고 되어있는데, 이부분을 원하는 엑셀이름으로 바꿔도됨.

 

이렇게하면, 1.test 라는 폴더안에 test1.xlsx 이 생성되고 images 폴더안에 사진들이 알아서 저장된다.

 

 

 

 

728x90
반응형

Execution failed for task  :compileJava'.

 

분명 Project Structure... 에서 JDK 버전도 제대로 적용시켜놨는데 자바 버전 차이로 안되는 이유를 찾아헤맸다.

 

Gradle을 쓰고있었는데 settings > Build, Executin, Deployment  > Gradle > Gradle JVM 설정이 변경이 안됐었다.

JVM설정 자바버전 동일하게 맞춰주니 정상적으로 빌드됨.

728x90
반응형

위 두가지 경우는 모두 내잘못이다.

 

mybatis 데이터 안넘어올때

 

1. dto 수정한적이 있는가?

2. 수정했다면, resultMap 에 해당 property & column을 추가하였는가?

3. select 할때 해당 데이터 컬럼명을 추가하였는가?

 

이 세가지만 보면 대체적으로 해결된다.

 

resultMap 안먹힐때

 

1. 데이터 받는 타입을 별도로 설정안했고 resultType 으로 받는가? 

2. 데이터 받는 타입을 resultMap으로 설정하였으며 resultMap 으로 받는가?

 

이게 이상하게..잘 안보이는데, 꼭 result type 인지 map 인지 확인하자

 

시간버리지말고!!!!!

728x90
반응형

로컬에서는 전~ 혀 문제가 없이 잘됨. 잘된다는 의미는

head 에 걸어놓은 js 파일들 전송 잘되고 css 안깨지고 백단에서도 오류가 없을 때.

 

그럴때 우선적으로 실서버 DB를 연결해서 실행해보자.

의외로 실서버 DB에 연결했을때 DB 세팅에서 놓친 부분이 있을 수 있다.

아주 위험한..주니어의 발상... 실서버 연결하면 안되요!!

 

그리고 JS / CSS 파일이 깨졌을 때 !

 

swiper.min.js 

Failed to execute 'getComputedStyle' on 'Window': parameter 1 is not of type 'Element'.

참고로 해당오류는 swiper-container / swiper-wrapper / swiper-slide 순서대로 안해줫을때 나타나는 오류이다

 

프론트의 문제가 아니라 백단에서 오류가 생겨서 F12 관리자 창에서도 Network 에 아무것도 안잡히고

'원인을 알수없는' 오류가 되어버린다.

 

분명 js/css 가 엉망진창이고 콘솔오류도 js에서 난다고 확인되는데 프론트에서 이상이 없다고 판단되면

실서버 DB붙여서 확인해볼것!

실서버 db 붙이면 안되요 ㅋㅋㅋㅋ 분명히 이유가 있습니다. 서버 로그를 확인하세요!

728x90
반응형

jsp단에서 java로 배열 array 전송 시 java.lang.NumberFormatException: For input string: "" 에러가 발생했다.

 

나의 경우

 

1. jsp에서 java 로 ajax 전송

var param = {
			"id" :"123",
			"isIssue" : "Y"
		     };

$.post('/경로', param, function(response){
			if (response.isSuccess) alert("성공);
});

 

2. 그리고 java 컨트롤러에서 잘 들어왔는지 확인 후 처리

@RequestMapping(value="/경로")
@ResponseBody
public JsonView codeCheck(TaxInvoice invoice) {
          //처리
}

들어올때 TaxInvoice 라는 dto 형식으로 들어오게되는데 해당 dto는 아래와 같다.

 

3. dto 형식

public class TaxInvoice {

  private String[] id;
  private String isIssue;

}

 

문제는 dto의 id를 보면 string[] array로 되어있었고 나는 파라미터를 보낼때 배열을 보내고싶었다.

var param = {
	"id" :["123","123"],
	"isIssue" : "Y"
};

 

그래서 위와같이 배열을 만들어서 넣어줬지만, 통하지 않았고 익셉션발생.

java.lang.NumberFormatException: For input string: "" (AbstractHandlerExceptionResolver.java : 133) *****
[07/27 10:56:32] OP-210727105632485-/opmanager/receipt/tax-invoice/update-status [AJAX] 	ERROR	1	-	-	-	***** [예외발생] {} (OpHandlerExceptionResolver.java : 76) *****
java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:592)
	at java.lang.Integer.parseInt(Integer.java:615)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:327)
	at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:280)
	at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:95)
	at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:834)
	at org.springframework.validation.DataBinder.doBind(DataBinder.java:730)
	at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:189)
	at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:106)
	at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.bindRequestParameters(ServletModelAttributeMethodProcessor.java:150)
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:110)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:729)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

 

해결방법은 ajax post 옵션 설정에 있었다.

ajax 옵션 중 traditional : true를 추가해야 했었다.

 

축약형 $.post 형식으로 쓰고있어서 옵션을 예쁘게 넣는방법이 없나 고민했지만, 결국 풀어쓰기로했다.

 

var param = {
			"id" :["123","123"],
			"isIssue" : "Y"
		};

$.ajax({
		type : "post",
		url  : "/경로",
		data : param,
		traditional : true,
		dataType : "json",
		success: function (response){
			alert("성공");
			location.reload();
		}

	});

 

이걸몰라 삽질하고있었다니! 

 

728x90
반응형

도.대.체

 

이유가 뭘까.

 

1. popup 페이지 jsp단에서 jquery로 cookie 생성

$.cookie('DOWNLOAD_STATUS', 'in progress', {path:'/'});

 

2.  controller 불러서 modelAndView excel 객체로 return.

 

return 할 excel 객체 생성 시 

 

Cookie cookie = new Cookie("DOWNLOAD_STATUS", "complete");
	cookie.setHttpOnly(true);
	cookie.setPath("/");					// 모든 경로에서 접근 가능하도록 
	response.addCookie(cookie);				// 쿠키저장

쿠키도 같이 생성하여 HttpServletResponse 에 추가. (response.addCookie)

 

3. jsp에서 cookie 값 확인

if($.cookie('DOWNLOAD_STATUS') == 'complete') {
   alert("성공");
}

 

4. 결과적으로 $.cookie('STATUS') == undefind

 

대체 왜??

 

크롬 개발자모드에서도 확실히 값이 확인되는데..

 

분명히 complete 라고 찍혀있지만 

개발자모드 console 에서 $.cookie('DOWNLOAD_STATUS'); 찍어보면 undefind로 나온다.

 

크롬 개발자모드 Application > cookies > 서버 주소로 들어가서 확인되는 쿠키를 찍었는데 undefind가 나온다고?...

이해가 안됨.

 

다음주에야 말로 문제 해결할것이다.

 

예상가능한 트러블로는

 

1. java단에서 HttpServletResponse 로 보내줬을때 jsp에서 잘 못받나?...뭔가 꼬이나?..

2. 데이터타입이 달라서 string으로 못읽어오나?..

 

이정도이다.

 

왜냐하면

 

관리자모드 Application cookies 에서 봤을 때 

1. jsp에서 cookie 생성했을때 --> 정상적인 값 (in progress)

2. java에서 jsp로 다시 넘어왔을때 ---> 정상적인 값 (complete)

 

인데... 넘어오고나서 콘솔로 쿠키찍어봤을 때 undefind 뜨는걸보니 ... 넘어올때 무슨 문제가 있던게 아닌가 싶다.

 

 

 

문제해결!!

Cookie cookie = new Cookie("DOWNLOAD_STATUS", "complete");
	cookie.setHttpOnly(false);              // true -> false로!!!!!
	cookie.setPath("/");					// 모든 경로에서 접근 가능하도록 
	response.addCookie(cookie);				// 쿠키저장

httpOnly를 false로 바꿔주면..해결 ^^......

728x90
반응형

Edit Configrations... > Gradle Debug > Debug all tasks on the execution graph 체크

 

728x90

+ Recent posts