StratoSphere Stream

사람들은 하나씩 빼먹고 설명을 하는데(나도 그렇지만) 이건 꼭 써야 할거같아서 쓴다.


accountRepository.save(Account.builder() 이런식으로 쓸 경우 builder()가 안뜨는 경우가 있다.


 - 해결방법


    compileOnly('org.projectlombok:lombok')


당연하지만 lombok은 추가해야 한다.


우선 lombok이 있는 위치로 간다

나의 경우는


C:\Users\ACID\.gradle\caches\modules-2\files-2.1\org.projectlombok\lombok\1.16.22\e555426550f54284fefb09065f2123a1d9be0b73


였다. lombok-1.16.22.jar 이라는 파일이 있을것이다. 버전은 다르지만 대략 저런 파일이다.


이제 CMD를 관리자권한으로 실행[각주:1]해서


C:\Users\ACID\.gradle\caches\modules-2\files-2.1\org.projectlombok\lombok\1.16.22\e555426550f54284fefb09065f2123a1d9be0b73


위치로 간다 명령어는



cd C:\Users\ACID\.gradle\caches\modules-2\files-2.1\org.projectlombok\lombok\1.16.22\e555426550f54284fefb09065f2123a1d9be0b73


이런식이다. cd + 탐색기에서 복사한 위치로 가면 된다.


그리고나서



 java -jar lombok-1.16.22.jar


이렇게 실행을 한다. 실행하면



이런 화면이 뜨는데 자동으로 추가되지만 안될경우는

Specify location을 눌러서



STS.exe파일을 찾아서 실행하면 된다.


제대로 되면 Successful 글자가 어딘가 나올거고 STS.ini파일에 적당히 추가된 것이 보인다.


-vmargs
-javaagent:C:\Program Files\STS\sts-Springboot\sts-3.9.6.RELEASE\lombok.jar


대충 이런거


이렇게 해서 Builder()가 정상적으로 작동을 할 것이다.


  1. 가끔 나같이 program 폴더에 넣으면 수정시 관리자 권한이 필요하다. [본문으로]

Comment : 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    @RequestMapping(value = "/html/test01", method = RequestMethod.POST)
    public String test01post(@RequestParam(value = "email", defaultValue = "0", required = trueString email,
            @RequestParam(value = "password", defaultValue = "0", required = trueString password, Model model,
            HttpSession ses) {
 
        System.out.printf("id %s \n", email);
        System.out.printf("password %s \n", password);
 
        model.addAttribute("result", password);
 
        ses.setAttribute("login", email);
 
        return "./html/test01";
    }
cs


RequestParam은 요청된 파라메타가 없으면 처리해주는 방식이다. 


required : 필수인지 아닌지 선택, 만약 false 라면 defaltValue로 간다.

defaltValue : 기본값. flase인 경우 동작


1
2
3
4
5
6
7
8
    @RequestMapping(value = "/html/test01Model", method = RequestMethod.POST)
    public String test02post(@ModelAttribute("info") users user, HttpSession ses) {
        System.out.printf("ModelAttribute \n");
        System.out.printf("user %s  \n", user);
        ses.setAttribute("login", user.getEmail());
 
        return "./html/test01";
    }
cs


@ModelAttribute 는 받아오는 데이터를 지정한다.

Vo로 지정된 형태인데, info로 model에 저장을 해준다. 그래서 JSP페이지에서는


1
  <p>ModelAttribute result: ${info.email}</p>
cs


을 쓰면 자동을 보인다. 


1
@SessionAttributes("board")
cs


SessionAttributes는 "----"이름으로 된 것은 Session에 자동으로 저장된다. 

여러개를 저장할 땐 SessionAttributes(["data1", "data2"])


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
@RequestMapping(value = "/html/test01", method = RequestMethod.POST)
    public String test01post(@RequestParam(value = "email", defaultValue = "0", required = falseString email,
            @RequestParam(value = "password", defaultValue = "0", required = trueString password, Model model,
            HttpSession ses, HttpServletResponse response) {
 
        System.out.printf("id %s \n ", email);
        System.out.printf("password %s \n ", password);
 
        model.addAttribute("result", email);
        //세션저장
        //@SessionAttributes("login") 으로 자동으로 저장할 수 있다. 
        ses.setAttribute("login", email);
        // 세션의 타임아웃 설정 : 1초당으로 계산된다. 
        ses.setMaxInactiveInterval(20*60);
        
        //쿠키로 저장하는 방법
        Cookie cookie = new Cookie("login", email);
        // 쿠키시간 설정
        cookie.setMaxAge(20*60);    
        //마지막에 HttpServletResponse 에 add해줘야 한다.
        response.addCookie(cookie);
        
 
        return "./html/test01";
    }
cs


이런식으로 사용이 가능






Comment : 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1</version>
        </dependency>
 
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.1</version>
        </dependency>
cs


pom에 기본적으로 추가 


1
2
3
4
5
6
    @RequestMapping(value = "/html/test3json", method = RequestMethod.POST, produces = "application/json" )
    public String test03post(@RequestBody Map<String, Object> jsons) {
        System.out.println(jsons);
        
        return "./html/test3";
    }
cs


RequestBody를 꼭 써야 한다. 그래야 받은 텍스트 전채를 인식한다. 

위는 Map형식으로 String으로 인식하는 방법은 


1
2
3
4
5
6
    @RequestMapping(value = "/html/test3json", method = RequestMethod.POST, produces = "application/json" )
    public String test03postString(@RequestBody String jsons) {
        System.out.println(jsons);
        
        return "./html/test3";
    }
cs



Map을 String으로 고치면 된다. 

Comment : 0

Map과 List만으로도 Json을 만들수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1</version>
        </dependency>
 
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.1</version>
        </dependency>
cs


pom에 추가한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@ResponseBody
    @RequestMapping(value = "/html/test3", method = RequestMethod.POST)
    public Map<String, Object> test03post() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("StringNum""111");
        map.put("intNum"222);
        
        ArrayList<jsonVo> jlist = new ArrayList<jsonVo>();
        for (int i = 1; i < 5; i++) {
            jsonVo vo = new jsonVo();
            vo.setNum(i);
            vo.setAge("19");
            vo.setName("이유나");
            vo.setEmail("rosellia@gmail.com");
            vo.setAddress("서울시");
            
            jlist.add(vo);
        }
    
        map.put("list", jlist);
 
        return map;
    }
cs


컨트롤러에 추가한다.


map형태로 response한다. Map과 Arraylist를 쓰는 방식이다. JsonObject를 안써도 이렇게 해서 Json을 만들 수 있다. 



Comment : 0


우선 Gcloud를 다운받는다. 

프로젝트는 만든 상태로 가정을 한다.


여기서 만들면 됨. 적당히 하나만들면 된다.

참고로 구글 클라우드 사용시 1년은 대략 이상한 뻘짓을 하지 않는 이상은 카드 결제로 안나가고, 설령 1년 지나도 그때가서 너 유료 쓸거임? 한다. 
정 불안하면 이 사이트에 있는 구글 어시스턴트 앱 만드는거 참조해서 
dialogflow 쓰레기 앱 만들면 된다. (1달에 200달러 쿠폰 날라온다. 덤으로 티셔츠하고 잘하면 구글홈도.)
진짜임. 






위의 프로젝트를 설치한다.


에러시 아래를 cmd에서 실행하면 된다. (deploy때 저런 에러가 나와서 그제서야 알았음)


gcloud components install app-engine-java





다음과같이 프로젝트를 만든다. 




localhost에서 테스트를 할려면 다음과 같이 한다.


Server App Engine Standard at localhost failed to start.


만약 에러 시




자 이제 deploy를 한다. 업로드 하는것. 

아무것도 안건들였으니 잘 되겠지 라고 생각했는데.



그러고보니 프로젝트에서 app engine에 대한 것은 인식하지 않았다.


명령어대로한다. 





지역을 가까운데로 설정하면 된다고 하는데

그에 따라서 돈 액수도 다르고 성능을 선택할 수 있는 것도 다르다.


테스트인지라 그냥 1번 미국으로 한다.

사실 미국이 선택지도 많고 성능도 좋고 싸다. 지금걱정할 것은 아니지만.




이렇게 해서 업로드가 되었고 서버에 올라갔다. 





Comment : 0

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
   
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
       
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
   
    <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>


</web-app>


굵은 부분을 추가해 주면 된다.


Comment : 0



C:\Users\사용자명\.m2 에 있는 repository 삭제하면 된다.


Comment : 0

@ResponseBody

@RequestMapping(value = "/json", method = RequestMethod.POST, produces = "application/json; charset=utf-8")

public String jsonx(String id) {



produces = "application/json; charset=utf-8"


이걸 쓰지 않으면 view에서 물음표로 받는다. 쓰면 정상적으로 출력 

Comment : 0

@ResponseBody

@RequestMapping(value = "/json", method = RequestMethod.POST, produces = "application/json; charset=utf-8")

public String jsonx(@RequestBody String body) {


@RequestBody String body


를 쓰면 파라메터 이름을 몰라도 body로 일단 받을 수 있다.

위는 json을 받아서 json으로 return 시키는 부분인데 파라메터를 몰라서 이걸 써야 했다. 



Comment : 0

<!-- https://mvnrepository.com/artifact/org.json/json -->

<dependency>

<groupId>org.json</groupId>

<artifactId>json</artifactId>

<version>20160810</version>

</dependency>





일단 위의 코드를 pom에 추가한다. 수동으로 json을 만드는 방법도 있는데 그건 사람이 할 일이 안된다..


{    "result":200",

"foundation":"C",

item":

[

{"password":"123","id":"이인직"},

{"password":"123141","id":"허경영"},

{"password":"3124","id":"김본좌"}

]

}


예시문이 좀 이상하지만 다음의 json을 만든다고 하자.


account의 VO는 다음과 같다.


package com.testDrive.netis;


public class account {


private String id;

private String password;


public account() {

super();

// TODO Auto-generated constructor stub

}


public account(String id, String password) {

super();

this.id = id;

this.password = password;

}


public String getId() {

return id;

}


public void setId(String id) {

this.id = id;

}


public String getPassword() {

return password;

}


public void setPassword(String password) {

this.password = password;

}


@Override

public String toString() {

return "account [id=" + id + ", password=" + password + "]";

}


}




컨트롤러단의 코드는 다음과 같다.


ArrayList<account> alist = new ArrayList<account>();

alist.add(new account("이인직", "123"));

alist.add(new account("허경영", "123141"));

alist.add(new account("김본좌", "3124"));

//여기까지 arraylist 불러오는 부분

JSONObject obj = new JSONObject(); // json object 생성 

obj.put("result", 200); //넣기

obj.put("foundation", "C"); //넣기


obj.put("item", alist); // Arraylist를 그대로 넣는다. 

return obj.toString(); // String으로 반환

}


JsonArray를 사용하지 않아도 자동으로 넣어진다. 

Comment : 0