728x90

-개요

빈번히 사용되는 textarea 태그 설정법을 정리하고자 한다.

 

-textarea 태그의 기본 속성-

onkeydown : 사용자가 키보드의 키를 '누를때' 적용

onkeyup : 사용자가 키보드의 키를 눌렀다가 '땟을때' 적용

 

-textarea 태그의 style 지정- 

outline : textarea 영역 내부를 사용자가 클릭하였을때만 발생하는 외부 경계선

border : 기본 textarea의 외곽선이 설정되어있음

resize : none 속성이 아닐시 사용자가 임의로 textarea 영역의 크기를 조절할 수 있음

 

하단의 이미지는 resize가 none이 아닐경우 이미지

 

-textarea의 줄이 기본높이를 넘어가도 스크롤바 안생기게 하는 것

-글씨제한수에 맞춰서 초과시 클라이언트에게 경고를 주고 맥시멈글자수만큼 자르기  

-둘다 javascript 로 작성

 

하단의 샘플은 현 블로그 게시글에서 말한 기능들을 전부넣었습니다

-*.html-

1
2
3
4
5
6
7
8
9
10
11
12
<!--덧글작성-->
<textarea  onkeydown="resize(this)" onkeyup="fn_checkByte(this,300)" placeholder="내용을 입력해주세요"
style="width: 100%; min-height: 3rem; max-height: 9rem; resize: none;"
 ></textarea>
<!--//덧글작성-->
    ~~~
<div>
     <span>Totalbyte</span>
</div>
<div>
     <span>(</span><span id="nowByte">0</span><span>/</span><span>300</span><span>)</span>
</div>
cs

2 : onkeydown , onkeyup 의 속성값으로 javascript함수를 각각 넣어주었습니다.

 

-*.js-

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
32
33
34
35
36
37
38
39
40
41
function resize(obj) {
        obj.style.height = "1px";
        obj.style.height = (12+obj.scrollHeight)+"px";
    }
function fn_checkByte(obj,maxByte){ //maxByte:최대바이트
        resize(obj);//resize
 
        const text_val = obj.value; //입력한 문자
        const text_len = text_val.length//입력한 문자수
        var cropped_text="";//잘라진 출력할 문자열
        var texting_len=0;//글자단위의 길이(모든문자,한글포함)
 
        let totalByte=0;//기록될바이트수
        for(let i=0; i<text_len; i++){
            const each_char = text_val.charAt(i);//한 글자씩 따옴
            const uni_char = escape(each_char) //유니코드 형식으로 변환
            if(uni_char.length>4){
                // 한글 : 2Byte
                totalByte += 2;
            }else{
                // 영문,숫자,특수문자 : 1Byte
                totalByte += 1;
            }
            if(totalByte <=maxByte){//return할 문자열 갯수
                texting_len=i+1;
            }
        }
            
        if(totalByte>maxByte){
            alert("최대 "+maxByte+"Byte까지만 입력가능합니다.");
            document.getElementById("nowByte").innerText = totalByte;
            document.getElementById("nowByte").style.color = "red";
 
            cropped_text =text_val.substr(0,texting_len);//오바된만큼 자르기
            obj.value=cropped_text;
            fn_checkByte(obj,maxByte);
        }else{
            document.getElementById("nowByte").innerText = totalByte;
            document.getElementById("nowByte").style.color = "green";
        }
}
cs

1~4 : textarea에 생긴 스크롤 길이에 12px을 더해서  textarea의 높이로 설정한다. 

( obj.scrollHeight 가 유동적으로 변함에 따라 textarea의 높이도 유동적으로 변하게 된다.)

 

5 : fn_checkByte 함수에는 두가지 기능이 있다 . 

    1. resize 기능

    2. 사용자가 제한된 바이트수를 초과하게 입력하면 추가된 만큼 crop 시켜준다.

35 : 제한된 크기만큼 잘려진 텍스트가 textarea에 들어간다.

36 : 35줄에서 textarea에 들어가는 텍스트가 변경되었으므로 , 재귀 호출 때려서 38~39줄이 실행되게 만든다.

 

하단의 이미지는 글자수제한을 넘겨서 입력하였을 경우의 이미지이다. 

( ctrl+v 를 연타 하여서 텍스트글자수는 분명오바가 됬지만  표시상으로는 202 라고 나왔다.)

하단의 이미지는 윗 이미지에서 확인을 누를경우 , 글자수제한에 맞게 cropped된 이미지이다.

 

-참고

https://zetawiki.com/wiki/HTML_textarea_%EC%9E%90%EB%8F%99_%EB%86%92%EC%9D%B4_%EC%A1%B0%EC%A0%88

728x90

- SPRING 3.9.7 ver 조건의 ajax 처리 예시가 적어서 찾는데 고생을 하였으나 

사용해본 결과 , 대강의 문법은 SPRING 4이상 ver과 비슷하다.

 

하단의 샘플이미지처럼,  비동기 통신이 성공 하였을때 , 크롬 f12 에서  Request Headers , Resonpse headers 로 타입을 확인 할 수

있다.

 

-front part-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function ajaxTest2(){
            var formarian = {
                    name"jamong",
                    age: 100
            }
            $.ajax({
                url: "stringify",
                type: "POST",
                data: JSON.stringify(formarian),
                contentType: "application/json",
                dataType: "json",
                success: function(data){
                    var txt = data.name + data.age;
                    $('#ajaxText').val(txt);
                },
                error: function(){
                    alert("stringify err");
                }
            });
}     
cs

9 :  서버로 data 에 지정된 값을 전달

     +)request 안에 포함된 json 형태의 데이터를 서버가 받았을 때, 이것을 보통 VO(혹은 DTO)에 다시 담아 사용하는데  .ajax는 데이터를 문자열화 해주지 않기 때문에 보낼 데이터를 JSON.stringify()로 감싸주어야 합니다.

참고 : https://thiago6.tistory.com/11

 

10 : contentType: "application/json" 은 , client-> server 로의 데이터 전달을 json으로 지정하는 것이다.

11 : dataType:'json' 은   server->client 로의 데이터 반환 타입을 json으로 지정하는 것이다.

 

-SPRING MVC controller-

1
2
3
4
5
6
@RequestMapping(value = "/stringify"
        produces = { MediaType.APPLICATION_JSON_VALUE} , method=RequestMethod.POST)     
    public @ResponseBody Map<String,Object> getTodayChart(@RequestBody Map<String,Object> map) {         
        System.out.println(map);
        return map;
    }
cs

2:  produces 에서 JSON객체를 반환하겠다고 지정.

 

    @RequestMapping에는 요청과 응답에 관련한 프로퍼티를 설정할 수 있습니다. produces와 consumes 이 있다.

    produces는 어떠한 데이터 형식으로 응답할 것인가를 결정하는 부분입니다.

    consumes는 어떠한 요청에 대해서 처리할 것인가를 결정하는 부분입니다.

produces를 설정하지 않는다면 , HTTP 요청의 Accept 로 HTTP Message Convertor가 자동으로 컨버터 시켜준다.

 

 

3 : @RequestBody를 Map 앞에 추가해 주어야 한다.

그래야 넘어온 json 값들이 map변수에 key, value값들이 잘 매핑이 된다.

 

 

@RequestBody - JSON형태로 받게해주는 Annotation이며 ,  JSON 데이터를 원하는 타입으로 바인딩 처리

 

@ResponseBody - 일반적인 JSP와 같은 뷰로 전달되는 게 아니라 데이터 자체를 전달하기 위한 용도

메소드의 return형 앞에 @ResponseBody를 붙여서 사용하도록 한다.

 

 

-pom.xml-

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
<!--  Jackson librarys -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        
        <!-- Jackson 2.0 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.12.3</version>
        </dependency>
        
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>
        
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.12.3</version>
        </dependency>    
cs

Spring 3.1.1 인 경우 정상적으로 json 을 출력한다. 다만 버전을 3.2.x 로 업데이트한 경우 문제가 발생한다.
Spring 3.2.x 인 경우 Jackson2 가 필수 사항이기 때문이다.
출처: https://syaku.tistory.com/290 

해당 글을 보고 , Spring 3.9.7에서도 비슷한 이슈거리라고 생각하였다. 이에따라 pom.xml의 jackson-mapper-asl 을 제외한 모든 jackson 버전을 2.대로 맞추어 주었다.

 

https://mvnrepository.com/

윗 공식 mvn-repository에서 dependency등록이 가능한 버전들을 검색할 수 있다.

 

 

 

참고 : jackson라이브러리 , @RequestMapping의 produces,consume  참고 https://github.com/kdevkr/spring-demo-ajax

참고 :  $.ajax head 용어참고  https://thiago6.tistory.com/7?category=827229 

 

728x90

자주사용되는 데이터 전달객체들은 하단의 주소에 자세히 설명되어있다.

참고주소: https://codevang.tistory.com/247

 

-StereoType-

https://incheol-jung.gitbook.io/docs/q-and-a/spring/stereo-type 

해당주소에 스테레오타입의 정의에 대해서 자세히 설명되어있다.

 

-어노테이션-

-@Repository ,@Service-

위 두 어노테이션에 대해서는 

https://m.blog.naver.com/PostView.naver?blogId=kbh3983&logNo=220908370180& 

해당 주소에서 자세히 설명해주고 있다.

 

-@Autowired, @Inject-

위 두 어노테이션에 대해서는

https://velog.io/@sungmo738/Resource-Autowired-Inject-%EC%B0%A8%EC%9D%B4 

https://codevang.tistory.com/256

해당 두 주소가 자세히 설명해주고 있다..

 

-@RequestParam-

client -> server 로 단일 데이터를 옮기는데 사용되고, 메소드의 파라미터로 쓰인다.

 

@RequestParam 문법 :

@RequestParam(value="checkbox",required=false,defaultValue="0") 자료형타입 변수명

value(필수) : client에서 전달해준 key값

required(필수x) : true로 지정할시 넘어오는 key값이 없다면 에러발생, false로 지정할시

                      넘어오는 키값이 없더라도 정상작동됨(대신 null이 변수에 들어감)

defaultValue(필수x) : "required=false" 일 경우에, 변수에 설정해준 defaultValue값을 넣어줌.

자료형타입 변수명(필수) : value="checkbox"에 매칭되는 값이 대입된다.

 

본인은 단일 checkbox 체크유무를 위하여 사용하였다.

하단의 샘플은 @RequestParam을 사용한 예시중 어노테이션 부분위주로만 뽑았다.

1
2
3
4
5
6
7
8
9
@RequestMapping(value="/Login",method = RequestMethod.POST)
public String postLogin(@RequestParam(value="checkbox",required=falseString checked,~) {
    ~~
    if(checked!=null
        session.setMaxInactiveInterval(-1); //web.xml
    else 
        session.setMaxInactiveInterval(60*30);
    ~~    
}
cs

 

checkbox에서는 name="checkbox"로 설정되어있으며 , checkbox는 form 태그내부에 존재한다.

2 : checked 에 value="checkbox" 와 매칭되는 값이 들어온다.

defaultValue를 지정해주지 않았으므로 , 들어오는 값이 없다면 기본적으로 null이 checked에 들어간다. 

4~7 : checked가 null인가 아닌가로 구분하여 셋팅해주었다.

참고로, checkbox가 선택됬다면 값은 기본적으로 "on"이 들어오게 될것임.

 

-@RequestMapping-

client->server로 오는 url을 mapping 시켜준다. or redirect,forward로 server->server 오는 url을 매핑시켜준다.

문법:

@RequestMapping(value= {"/","/main"},method = RequestMethod.GET)

value(필수) : 매핑될 url , 다수url 매핑을 원할시 위와 같이 작성해줌.

method(필수x) : method를 작성해주지 않을시 post, get 방식모두 허용해줌

참고로,,, Spring 4.3부턴

HTTP 메소드들로 restful하게

@PostMapping,@GetMapping,@PutMapping,@DeleteMapping,@PatchMapping  

해당 5가지가 더 지원된다고 한다..

 

하단의 샘플은 웹의 루트인 url : / 와 url :/main 을 같이 묶어 주었다. 

1
2
3
4
@RequestMapping(value= {"/","/main"},method = RequestMethod.GET)
    public String main() {
        return "main";
}
cs

 

------------------------------------------------Lombok-------------------------------------------

@Getter, @Setter, @ToString, @EqualsAndHashCode , @RequiredArgsConstructor, @NoArgsConstructor , @AllArgsConstructor , @Data 

 

@Getter : Getter 메소드가 자동으로 생성

 

@Setter : Setter 메소드가 자동으로 생성

 

@ToString : toString 메소드를 자동으로 생성

 

@EqualsAndHashCode : Equals 와 HashCode 메소드를 자동으로 생성

 

@RequiredArgsConstructor : final이나 @NonNull로 지정된 필드 값만 파라미터로 받는 생성자를 만들어줍니다.

 

@NoArgsConstructor : 파라미터가 없는 기본 생성자를 생성해줌

 

@AllArgsConstructor : 모든 필드 값을 파라미터로 받는 생성자를 만들어줌

 

@Data : 클래스레밸에서 해당 Annotation 이용시 , Lombok에서 지원하는 윗 어노테이션기능들을 모두 수행해준다. (@RequiredArgsConstructor 가 선택됨 )

 

-참고주소

https://stackoverflow.com/questions/37359851/how-to-receive-html-check-box-value-in-spring-mvc-controller

https://www.daleseo.com/lombok-popular-annotations/ (Lombok)

728x90

-요약

HTTP의 특징  2가지:

1. 비연결성은 HTTP통신 이후 연결을 끊는 특징이고,

2. 비상태성은 이전 HTTP 통신의 상태를 유지하지 않는다는 것

이를 해결하고자 쿠키와 세션을 이용함.

https://velog.io/@ground4ekd/auth-cookie-session 참고.

 

쿠키 : KEY,VALUE 인 STRING 형태로 ,  클라이언트에 저장됨.    보안 약함.
세션 : Object 형태로 서버에 저장됨.   쿠키보다 보안이 좋음

 

자세한 정보는 https://devuna.tistory.com/23 을 참고하였다.

 

 

-직접사용해보기

 

하단에 있는 샘플은 사용자가 로그인 페이지에서 ID,PASSWORD()를 입력후

Login-post url 를 호출하였을때의 controller 상황이다.

-1. 쿠키생성-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    @RequestMapping(value="/Login",method = RequestMethod.POST)
    public String postLogin(~~~~,HttpServletResponse response) throws Exception {
        System.out.println("controller - Login-POST");
        if((Integer)service.selectMember(userinfoVO)==1) {
            
            //create a cookie for the user id
            Cookie theCookie = new Cookie("IcApp.userName", userinfoVO.getId());
            theCookie.setMaxAge(60*60*24 );
            
            //add the cookie to the response
            response.addCookie(theCookie);
            
            return "main";
        }
cs

2 : server ->  client  로 쿠키를 넣어주기 위하여 HttpServletResponse  객체를 생성하였다.

7 : ( KEY , VALUE ) 형태로 쿠키를 생성한다 .   (참고로 userinfoVO.getId()은 사용자가 로그인페이지 에서 입력했던 id가 저장되어있다)   

8 : 쿠키의 유효시간을 하루로 설정하였다.  단위는 1초이다.

11 ,13: 쿠키를 response 에 실어서 main 페이지를 호출하였다.

 

결과페이지에서 생성된 쿠키를 확인 할 수 있다.

 

하단에 있는 샘플은 사용자가 로그인페이지로  이동하는 요청을 서버에 보냈을 경우이다.

- 2. client -> server 쿠키전달, 및 활용 (1) 비추-  (비추의 이유 : spring 을 쓴다면 어노테이션으로 축약해서 쓰자..)  

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value="/Login",method = RequestMethod.GET)
    public String getLogin(HttpServletRequest request,Model model) {        
        Cookie[] cookies = request.getCookies();//모든 쿠키들을 얻는다.
        for(Cookie temp : cookies) {
            if("IcApp.userName".equals(temp.getName())) {  //쿠키의 key 얻어옴    
                String userId = temp.getValue(); //쿠키의 value를 얻어옴
                model.addAttribute("userid", userId);
            }
        }
        return "Login";
    }
cs

2 : client -> server 로 넘겨주는 데이터(쿠키포함)를 받기 위해 HttpServletRequest 객체를 생성하였다.

3 : 클라이언트로부터 넘어온 모든 쿠키들을 얻는다.

4~9 :  쿠키의 key가 "IcApp.userName" 인 쿠키를 뽑는다.

         그리고 해당 쿠키의 value를 다시 model객체에 실어 client에 보낸다. 

10 : Login 페이지를 호출.

 

 

로그인페이지에 들어오자마자 자동으로 입력된 아이디를 확인 할 수있다. (물론 front부분도 dom탐색 처리해줬음)

 

 

 

@CookieValue ?

@CookieValue 어노테이션을 이용한다면 , HttpServletRequest 객체를 이용하지 않아도 

client로 부터 server가 원하는 cookie만 받아올 수 있다.

 

ex) @CookieValue(value="count", defaultValue="1", required=true) 자료형 변수

value : 적어야함.

value 속성값으로 전달 받을 쿠키의 이름을 지정한다.

required : 안적어도됨. (default : true )

required 속성을 true로 지정 하였다면,

value라는 key를 가진 쿠키가 존재하지 않을 시에 SPRING MVC는 Exception을 발생시킨다.

반대의 경우엔 Exception을 발생시키지 않는다.

defaultValue : 안적어도됨.

defaultValue은 쿠키가 존재하지 않을 경우 변수의 기본 값인듯.. 써보지 않음.

변수 : 적어야함.

변수에는 선택된 쿠키의 value가 들어감.

 

하단의 샘플은 윗 반복문 샘플과 동일한 수행을 한다.  

윗 샘플과 같이 , 사용자가 로그인페이지로  이동하는 요청을 서버에 보냈을 경우이다.

- 2. client -> server 쿠키전달, 및 활용 (2) 추천-  

1
2
3
4
5
6
@RequestMapping(value="/Login",method = RequestMethod.GET)
    public String getLogin(@CookieValue(value="IcApp.userName",required=falseString userId ,Model model) {
        System.out.println("controller - Login-GET");
        model.addAttribute("userid", userId);
        return "Login";
    }
cs

2 : required 를 false로 지정해주었다. default인 true로 하게 된다면 ,, 

"IcApp.userName"이라는 key를 가지는 쿠키가 없을때 에러를 발생시킨다. 아마 500 에러 날듯.

 

 

로그인페이지에 들어갔을때 , 자동으로 id가 완성된것을 볼수 있다.

 


-세션직접사용해보기

 

하단의 샘플은 사용자가 로그인페이지에서 로그인 정보를 입력하고 로그인 버튼을 눌렀을 경우 main페이지로 보내주는 예제이다.

1
2
3
4
5
6
7
8
9
10
    @RequestMapping(value="/Login",method = RequestMethod.POST)
    public String postLogin(UserinfoVO userinfoVO,HttpServletRequest request,~) throws Exception {
        System.out.println("controller - Login-POST");
        //id pw 비교
        if((Integer)service.selectMember(userinfoVO)==1) {
        //id pw 가 일치 할경우 , 세션 등록
            HttpSession session=request.getSession();
            session.setAttribute("Session_userID", userinfoVO.getId()); 
        return "main";
    }
cs

-기초개념-

서버가 최초로 jsp 페이지에 접근할때 , 마땅한 설정이 없다면 톰켓이 JSESSIONID 쿠키를 자동으로 생성해서 client로 전달한다. 

JSESSIONID : 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키

 

2 :  client->server 로 JSESSIONID 쿠키를 가져오기 위해서   HttpServletRequest 객체를 선언하였다.

7 : 세션획득.    JSESSIONID 쿠키가없다면 새 사용자라는 것으로 인식하여 새로운 Session을 만들고 반환, 

    JSESSIONID 쿠키가 있으면 존재하는 Session을 반환함.

8 : 세션 key-value를 한번 설정해두면 프로젝트내 모든 파일에서 "Session_userID" 에 접근이 가능하다.

 

프로젝트내 모든 파일에서 "Session_userID" 에 접근이 가능하다는 소리는 무슨 원리냐면은 ...

SSR원리에 의해 모든 view파일을 서버에서 만들어주고 client로 보내준다.

즉 , 서버 메모리에서  뷰단내에 있는 세션 key에 value를 붙여넣는 원리이다. 

 

보조설명으로,
브라우저의 쿠키중 JSESSIONID 의  value는 특정사용자에 대한 값으로 ,  서버가 특정 유저를 추적하는데 이용한다.
클라이언트가 Session key인 "Session_userID"의 value를 이용하려 할때,
우리가 외관적으로 보기에 모든 클라이언트에 동일한 session key ("Session_userID") - value  를 가지는 것 처럼 보이지만 
실제로는 JSESSIONID를 통해 session들을 구분하고 , 구분된 세션에서  session key ("Session_userID")에 대한 값을 얻는것이다.
즉, 클라이언트마다 JSESSIONID가 다르므로 다른 Session value를 얻게된다.

 

추가로) JSESSION value와    request를 통해 얻게되는 Httpsession객체.getId() 값은 동일하다.

 

하단의 결과 이미지들로 , 우리는 다른 브라우저마다 다른 세션 value를 얻은 것을 확인 할 수 있고,

JSESSIONID도 각각 다른 것을 확인 할 수 있다.

( view 단에서는 단순히 Session : ${Session_userID}  을 이용하였다. ) 

chrome에서 teamproject/test url로 접속

 

Internet Explorer 에서 teamproject/test url로 접속

 

- 세션 value 얻기 -

메소드에서 HttpServletRequest 파라미터를 가지는 대신 HttpSession 파라미터를 넣고

HttpSession객체변수.getAttribute("key값");  을 통하여 컨트롤러에서 데이터를 얻어 올 수도 있다.

 

 

하단의 샘플은 사용자가 로그아웃 버튼을 클릭시 서버에서 세션을 삭제해준다.

-server 에서 세션 삭제 - 

1
2
3
4
5
6
    @RequestMapping(value="/Logout",method = RequestMethod.POST)
    public String logOut(HttpSession session) {
        System.out.println("controller - logOut");
            session.invalidate();
            return "main";
    }
cs

2 : HttpSession 객체를 통해 JSESSIONID 쿠키와 연관된 세션을 받아온다.

4 : JSESSIONID 의 value에 일치하는 세션을 삭제한다.

5 : main page로 이동한다. 로그아웃 된 것을 확인 할 수 있다.

 

하단의 결과를 보면 , 메인 페이지에서 기존의 JSESSIONID쿠키가 삭제되고

새로운 JSESSIONID가 생성된 것을 확인할 수 있다.

 

 

하단처럼 web.xml 파일이 있을 경우 직접 세션만료시간을 수정할수 있다.(분단위)

-web.xml(tomcat server)-

1
2
3
4
5
6
7
  <!-- ==================== Default Session Configuration ================= -->
  <!-- You can set the default session timeout (in minutes) for all newly   -->
  <!-- created sessions by modifying the value below.                       -->
 
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
cs

 

web.xml 파일을 이용하고 있지 않거나 명령을 덮어 쓰고 싶을 경우 , 다음 명령어를 이용하여 제한을 줄 수 있다.

1
session.setMaxInactiveInterval(120);
cs

1 : 사용자가 웹사이트를 이용하고 있지 않은 경우 ,세션 만료시간 제한을 걸어준다.

    초 단위이며 , 인수가 음수일 경우 세션만료없음

 

 

-추가개념-

세션을 다룰때 ,  1.  HttpSession    2. HttpServletRequest 의 getsession  방법외에도

어노테이션을 이용하여 다음과 같이 다룰수 있다.

1
2
3
@Controller
@SessionAttributes("userinfoVO")   //실제내부에선 HttpSession 다룸
public class HomeController {
cs

  컨트롤러 클래스 윗부분에 @SessionAttributes 어노테이션을 지정한다.

자세한 사용법은 후에 필요할시에 찾아보자..

 

 

-연관없는 추가개념

servlet-context.xml와 root-context.xml의 차이 는 아랫 사이트에서 잘 정리가 되어있다.

https://thiago6.tistory.com/70

 

 

참고개념 : Selenium Express의 Session & cookie https://www.youtube.com/watch?v=cpFfzE9eGT0

728x90

-SPRING+MYSQL+MYBATIS 연동하는 방법-

https://all-record.tistory.com/175?category=733072 

윗사이트에 자세히 나와있다.

 

-한글설정-

mysql 내부에서 한글지정.

1
2
3
#한글설정
ALTER DATABASE webprojectdb CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE userinfo DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
cs

윗 두줄을 이용하여 db와 테이블 두곳에 utf8을 지정한다.

 

-Spring-DB사이 한글지정-

-root-context.xml-

1
2
3
4
5
6
7
8
9
<!-- MySQL dataSource -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
        <property name="url"
            value="jdbc:log4jdbc:mysql://127.0.0.1:3306/webprojectdb?useUnicode=yes&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="0000"></property>
    </bean>
cs

6 : 해당 줄의 webprojectdb 이라는 DB 뒤에 useUnicode=yes&amp;characterEncoding=utf8&amp; 를 지정해줘야

Spring-DB사이 데이터가 오고가는데 UTF8 설정이 됩니다.

 

 

-Spring 한글 설정-

-web.xml-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter     
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>   
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>  
        <param-value>true</param-value>
    </init-param>
</filter>    
 
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>                 
</filter-mapping>
cs

 

-참고-

다양한 어노테이션 방식과 여러 spring 개념들은

https://codevang.tistory.com/249?category=849481#recentEntries 

에 자세히 설명되어있다.

728x90

로컬 데이터가 변경된 상태에서 git status시 화면.

 

이 상황에서 git pull 을 수행하면 , 

다음과 같은 에러가 발생한다.

 

그럼 기존의 작업을 임시저장소에 저장시키기 위해 git stash 를 입력한다.

 

이상태에서 다시 git pull 을 수행한다.

 

다시 git status 확인.

 

git stash list  로  임시저장소목록을 확인한다. 아래그림에는 하나 등록된것을 볼수 있다.

 

git stash apply 를 통해 임시저장소에 저장된 가장 최근의 목록을 로컬로 가져온다.

자세한 옵션은 gmlwjd9405.github.io/2018/05/18/git-stash.html 을 참고한다.

 

이상태에서 git status 를 수행해본다.

 

기타 자세한 git stash 옵션은 gmlwjd9405.github.io/2018/05/18/git-stash.html 을 참고하자.

'GIT' 카테고리의 다른 글

Git - 협업과정  (0) 2021.09.12
branch 삭제 불가능할경우  (0) 2021.09.06
GIT - STS(eclipse)프로젝트로 협업시 gitignore 설정  (0) 2021.05.09
GIT - Git 구성도 및 Git Bash 명령어  (0) 2021.05.09
GIT-명령어,개념정리  (0) 2021.04.27
728x90

-데이터 베이스 한글지정-

1
alter database DB_NAME default character set utf8 collate utf8_general_ci;
cs

 

-테이블을 생성하기 위해 속할 데이터베이스를 사전에 지정하기-

1
use 데이터베이스명;
cs

 

 

-조합키(중복키=Composite key) 추가방법-

alter table 테이블이름 add PRIMARY KEY(column1, column2);  #다만 기존 Table에 PK가 정의되어 있으면 중복에러발생.

ex)

1
2
ALTER TABLE ITcomment ADD PRIMARY KEY(cidx,bidx);
ALTER TABLE humorcomment ADD PRIMARY KEY(cidx,bidx);
cs

참고 : hoho325.tistory.com/61

 

-RESTRICT , CASCADE , NOT NULL , NO ACTION

RESTRICT : 개체를 변경/삭제할 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 변경/삭제가 취소된다.
CASCADE : 개체를 변경/삭제할 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 함께 변경/삭제된다.
NO ACTION : MYSQL에서는 RESTRICT와 동일하다.
SET NULL : 개체를 변경/삭제할 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 참조하고 있는 값은 NULL로 세팅된다.
ex)

1
2
3
4
5
6
ALTER TABLE ITcomment
    ADD FOREIGN KEY (bidx)
    REFERENCES ITboard (bidx)
    ON UPDATE RESTRICT
    ON DELETE RESTRICT
;
cs

외래키 지정시 명령어이다.

4,5 : 업데이트, 삭제의 경우 제한사항을 RESTRICT 라고 지정하였다.

위에서 설명하였듯이  참조된 개체는 변경/삭제가 불가능하다. 

참고  : h5bak.tistory.com/125

'21년이전 > 국비-sql' 카테고리의 다른 글

프로그래머스 - JOIN 문제모음  (0) 2021.06.22
SQL - JOIN  (0) 2021.06.22
DB - 개념모델링  (0) 2021.05.10
국비 SQL - 명령어 모음  (0) 2021.02.22
728x90

-개요 

프로젝트진행전 ERD의 필요성에 의해 작성하기 위해 정확한 ERD 표기법및 사용법을 정리하도록한다.

실제 DB테이블 작성에 참고되는 논리모델링은

어차피 개념모델링을 작성하면 단기간에 그릴수 있으므로 작성하도록 한다..

 

-모델링의 구성

기획(스토리보드) ->  개념 모델링(ERD) -> 논리모델링(가상 테이블처럼 구성 PK등 표시 ) -> 물리모델링(실제 테이블이용)

 

-연관개념

식별자가 될수있는 키 : 후보키(CK)
후보키중에서 선택된 하나의 식별자 키 : 기본키(PK)
후보키 중에서 기본키가 아닌 키들 : 대체키(AK)
테이블에서 기본키가 없을 경우 
식별을 위해서 두개의 키를 합쳐서 만드는 키 : 중복키(composite key)=복합키
인조키 : autoincrement 이용하여 만듬.  

 

-ERD에 필요한 개념들-
Cardinality = 1:1 or 1:다 or 다:다 이런걸 말함 
1:1관계 
1:N 관계 = 1대 다 관계  (대략적설명.. ^^ 까마귀발 )
N:M관계 = 다 대 다 관계 (대략적설명.. ^^ 양까마귀발 )   
= 다만 다대다 관계를 DB테이블에서 표현하려면 연결테이블을 중간에 만들어서 컨버팅함.
Optionality =Optional = 있어도되고 없어도되고 (O) 표시
Mandatory = 필수적인 =  짝대기(|) 하나더표시

 

Optional , Mandatory  은 ERD 툴을 이용하면 자주 보게 될것이다.

 

아래그림은 프로젝트 진행중 작성한 ERD 이다.

 

 

-참고자료

ERD 내용부분에 대한 참고자료 : opentutorials.org/course/3883/25272

ERD 표기작성법에 대한 참고자료 : bamdule.tistory.com/46

백문이 불여일견으로 , Gliffy,DrawIO를 이용하여 직접그려보기.

'21년이전 > 국비-sql' 카테고리의 다른 글

프로그래머스 - JOIN 문제모음  (0) 2021.06.22
SQL - JOIN  (0) 2021.06.22
SQL - DDL  (0) 2021.05.12
국비 SQL - 명령어 모음  (0) 2021.02.22
728x90

defacto-standard.tistory.com/252 을 따라 공유하면 안되는건 제외시켜봄

 

.gitignore파일을 .git 폴더경로에 생성후

다지우고 , 

 .settings/ , .classpath , .project , .springBeans  이 4개를 제외파일로 정해놈.

(settings 은 디렉토리라 뒤에 / 를 붙여줌)


혹시 gitignore가 안될 경우를 대비해서 밑 명령어들을 수행해줌.
git rm -r --cached .
git add . 
git commit -m "cache removed"
git push  

'GIT' 카테고리의 다른 글

branch 삭제 불가능할경우  (0) 2021.09.06
GIT - git pull 시 에러  (0) 2021.05.12
GIT - Git 구성도 및 Git Bash 명령어  (0) 2021.05.09
GIT-명령어,개념정리  (0) 2021.04.27
GIT-STS연동,github의 대강적인구조  (0) 2021.04.27
728x90

-개요

 

본래 sts에서 git 연동해서 진행하려 하였으나 sts(eclipse)가 너무 불편하여 

이참에 git bash 로 협업파일들을 관리하기로 결정하였다.

 

-구성도

 

 

-명령어

----------------------------------------------etc-------------------------------------------------
(1)★특정깃 다운로드★
git clone 특정깃주소

(2)★변화확인★
git status

(3)★staging area -> unstaging area 로 단순올리는 것을 취소★
git reset 파일이름.확장자
git reset (모든파일 unstaging)

(4)★로컬에서 작업하다가 git에 최종등록되어있는 것으로 회귀-애매한데맞을것임★
git restore 파일명.확장자

(5)★어떤상태든 상관없이 마지막 커밋메세지수정★
git commit --amend
i키를 눌러 변집하고 esc키를 눌러 탈출한 뒤 :wq!를 입력하면 수정됩니다.

(6)★이미 push된 마지막 commit 메세지를 수정★
(5)를 거친후 , git push -f 해주면 된다.

(7)★push 된 로그들 확인★
git log

(8)★(remote 깃에 영향 없음) 특정 commit 부분으로 로컬프로젝트를 되돌림
(특정 commit이후 로그는 전부삭제됨. 역시 (remote 깃에 영향 없음) )★
git log 에서 해쉬 따와서
git reset --hard 해쉬값

(9)★(8)을 거친후 git push 진행시 rejected 발생하는데,이때 강제로 push 진행
(remote 깃 commit 내역이 로컬 commit 내역과 동일하게 바뀜)★
git push -f
--------------------------------------------------------------------------------------------------


-------------------------------- local => remote -----------------------------------------------
(10)★staging area로 적재★
git add 파일이름.확장자
git add . (모든파일 staging)

(11)★local repository로 적재★
git commit -m "커밋메세지 자유로이 작성"

(12)★remote repository로 적재★
git push
enter로 목록쭉 확인, 나올때는 Q 
---------------------------------------------------------------------------------------------------


----------------------------------- remote => local---------------------------------------------
(13)★remote repo 에서 변경데이터들 가져오기★
git pull
--------------------------------------------------------------------------------------------------

 

 

 

 

-참조 

동빈나 유투브 깃강좌

www.youtube.com/watch?v=I4latDqXo5M&list=PLRx0vPvlEmdD5FLIdwTM4mKBgyjv4no81&index=7

'GIT' 카테고리의 다른 글

branch 삭제 불가능할경우  (0) 2021.09.06
GIT - git pull 시 에러  (0) 2021.05.12
GIT - STS(eclipse)프로젝트로 협업시 gitignore 설정  (0) 2021.05.09
GIT-명령어,개념정리  (0) 2021.04.27
GIT-STS연동,github의 대강적인구조  (0) 2021.04.27

+ Recent posts