진형아빠이야기

안녕하세요.

진형아빠입니다. 


최근 ICT융복합과 관련하여 올해 초의 WEF(World Economic Forum)의 화두 였던 4차 혁명에 대해서 알아보겠습니다.












신고

Comment +0

SI에서 나의 개발 경력을 뒤돌아 보며...part-I

SI에서 나의 개발 경력을 뒤돌아 보며...part-II

SI에서 나의 개발 경력을 뒤돌아 보며...part-III

이후의 4번째 글을 써봅니다.

여기서는 제가 SI 탈출하기 위해서 공부했던 내용들과 자격증 그리고 감리에서의 기본적인 생활에 대해서 적어볼 생각입니다. 

1. 자격증 취득 과정

정보시스템감리사 혹은 기술사는 일정한 경력 이상의 IT분야 종사자가 시험에 응시해서 합격을 하면 됩니다. 

저는 개인적으로 주관식 및 손글씨가 너무 악필이라서 기술사는 엄두를 내지 못했습니다. 하지만, 만약 둘중 하나를 선택하라고 한다면 기술사겠죠. 감리사보다는 기술사가 아무래도 좀더 활용도가 좋을듯 합니다. 하지만 들어가는 노력은 고려해보셔야 합니다. 

몇몇 기술사분은 악필도 상관없다고 하시지만 보편적으로 악필은 펜글씨를 해서라도 글씨를 좀 손볼 필요가 있기 때문에 해당하는 노력이 추가로 들어갑니다. 게다가 좀더 빡시고요. ㅎㅎㅎ

글씨 악필인 저의 심정이었죠. ㅋㅋㅋㅋ

감리사의 경우는 객관식이긴 하지만 어려워요. 문제가 어렵습니다. 처음 문제를 보았을때는 그냥 4가지 선택지 모두 답이었어요. 점점 공부하고 암기를 하니 선택지가 하나씩 사라지더군요. 하지만 저 같은 경우는 마지막 시험날까지도 안정권에 못들어서 굉장히 초조했었답니다. 

감리사 시험은 보통 7월에 시험을 봅니다. 준비를 할 경우 바싹 많은 시간을 투하한다고 봤을때는 1월에 학원에 다니셔서....1~4월까지 학원 정규반 수업 4~6월까지 문제풀이반 학습 및 모의고사 등으로 준비하시는게 좋을듯합니다. 준비 시간은 많이 필요합니다. 저 시간에 준비를 하셔도 많이 모자랄수 있습니다 참고하시길...만약 본인이 공공분야의 SI경험이 없다! 라고 한다면 시간은 좀더 잡아두시는게 좋을듯 합니다. 저같은 경우는 SI경험이 대다수라서 배우고 프로세스, 절차 등이 그냥 알던 내용이라서 좀더 학습이 쉬웠던거 같습니다. 

아무튼 7월이 시험인데요. +-1달은 좀 생각을 하셔서 눈여겨 보셔야 합니다. 날짜가 변경될수도 있으니까요. 그리고 시험중비 동안 가족과 바이바이 혹은 양해를 구해야 합니다. 집안 지원이 불가능할겁니다. 

몇명이 되든 상관없이 1년에 시험은 1번 40등까지 합격입니다. 합격하면 끝은 아니고...감리원교육을 수료해야합니다. 뭐 이전 시험에 비하면 껌이죠. 지금은 어떤지 모르겟지만 학원비 120(주말반) + 30(문제풀이반) 정도에...합격 후 감리원 교육 150 만원해서 최단 코스도 거의 300만원 정도 들어간듯 합니다. 

학원은 개인적인 느낌상으로 필수입니다. 제가 나이가 많이 있진 않지만 나름 이쪽 밥 먹은게 십몇년인데...나이먹고 아래와 같은 수험생활을 시작하니 왠지 눈물이 앞을가리더라고요.

2. 감리사로서의 생활

SI의 전쟁터 같은 생활에 비하면 천국입니다. 하지만, 연봉은 중견이상의 대리, 과장보다 못할듯 싶네요. 즉, 낮은 연봉, 낮은 업무강도 이게 포인트라는거죠. 물론 낮은 업무강도라는건 상대적인 개념입니다. 혹자는 제가 이런말을 하면 자존심 어쩌구 일이 얼마나 많고 중요한대라고 목에 핏대를 세우시는데요. SI구축사업 특히 차세대에 비하면 업무 강도가 낮은건 사실입니다. 

초기에는 몰랐는데 나름 다른 시각으로 보니 SI업계도 참 어디 한구석 편한곳이 없더군요. 맨날 야근하면서 개발할때는 PM이나 사업관리 부장들은 탱자탱자 놀면서 월급받아간다고 뒷담화하고 했는데 나름 스트레스가 엄청난 자리더군요.  아래서는 대리 과장들 난리에...위에서는 회사 임원들 구박, 주관기관 담당자 구박, 집에서는 남편, 아빠만 쳐다보고 있고...가끔은 안쓰럽기도 합니다. 물론, 가끔 생각 자체가 클린하신 분들도 계세요. 

그렇다면 주관기관 담당자는 어떨까요? 이쪽은 또 이쪽대로 아주 스트레스가 많습니다. 본인이 관리하는 분야는 넓고 많은데 다 알수는 없고 대신 돈 받고 수행하는 수행사담당자들은 호시탐탐 대충대충할 기회만 엿보고 있으니까요. ㅎㅎㅎ그러다가 감사 혹은 공무원 윗분들에게 걸리면 그것도 골치아픈 일이고요. 일일히 법과 규정을 꼼꼼히 챙기기도 현실적으론 쉽지 않기도 하고 말이죠. 

감리업무는 사업수행사 - 감리 - 주관기관 사이에 있는 약 갑과 을의 중간 정도라고 보면 될듯합니다. 어차피 저희도 주관기관 담당자에게는 을이긴합니다. 정보시스템감리는 예전 처럼 주관기관까지 감리를 하는게 아니라서 주관기관을 넘어선 판단은 거의 불가능하다고 봅니다. 물론 객관적이고 명시적으로는 상관없는 제3자적 입장에서 감리를 하라고 하지만요. ^^ 

예를들어 최순실을 수사하는 우병우보고 제3자적 입장에서 수사하라는 말이랑 비슷합니다. 될까요?

어찌되엇던 공공정보시스템 구축사업을 해보았던 경험이 있기 때문에 감리 자체는 큰 어려움이 없더군요. 내가 사업하면서 귀찮고 안하던것은 여전히 안하고 뺑끼 쓰고 있어서 그런거 잡기가 참 쉬웠어요. ㅎㅎㅎ

그냥 예전에 제가 했던 안좋은 습관들을 가지고 탈탈 털면 보고서 거리가 나와서 한동안은 쉽게 쓰고 살았었습니다.

근데...LG CNS다닐때 정말 산출물 못만든다! 회사수준이 진따다...다니던 회사지만 뒷담화가 많았는데 이제야 왜 빅3, 대기업 SI라 불리는지 알았습니다. 멍청한애들중 제일 똑똑한 애가 CNS였던거였어요. ㅜㅜ

   

신고

Comment +0

스프링 부트는 excutable jar를 지원합니다. 

뭔말인고 하니 그냥 웹서버고 와스고 신경쓸거 없이 내장 톰캣을 통해서 프로젝트에서 한번에 말아서 배포하고 실행이 가능하다는 말씀!

게다가 H2같은 데이터베이스 까지 사용한다고 하면 WAS와 DB까지 하나의 JAR로 말아서 실행해버리는게 가능합니다.


일반적인 자바의 경우 웹 아파치 올리고 와스 톰캣 올리고 스프링 올리고 MYSQL연결하는 등의 작업을 할 필요가 없다는 말입니다.


성능이랑 세세한 튜닝은 어떻게 하냐고요?

네! 맞습니다. 그런건 디테일하게 신경쓰지 않았습니다. 사실 그 정도 질문을 하실 정도면 굳이 어렵지 않게 JAR를 WAR로 바꾸어서 일반적인 환경으로 다시 세팅할수도 있을듯 합니다. 


즉, 초기 세팅에 힘을 괜히 빼고 싶지 않은 경우 설정하면 좋을듯 합니다. 


우선 프로젝트를 만듭니다. 

뭐 어렵지 않게...그냥 데이터베이스도 없이 화면의 스트링을 리턴해주는 웹 애플리케이션을 만들어보겠습니다. 

여기서의 목적은 실행 JAR생성하고 실행하는데 목적이 있으니까요..^^


STEP1. 프로젝트 생성하기

이 부분은 간단하기도 하고 알고 있을거라고 생각하고 넘어가겟습니다.

Web모듈을 넣어서 간단하게 REST 리턴에 대한 확인을 수행할 예정입니다. 




STEP2. 프로젝트 실행 확인하기

이렇게 이클립스STS에서 실행하면 프로그램이 돌아가는것을 확인할 수 있습니다.

STEP3. 실행JAR로 패키징 하기

일반적인 케이스의 경우는 Maven으로 Command창에서 명령어로 입력하게 됩니다. 

하지만 저는...


그렇습니다. MAVEN패스 설정을 안해놓았네요. ㅎㅎㅎ

귀찮아서 그냥 이클립스에서 패키징을 해보도록 하겠습니다. 

MAVEN으로 업데이트 하고 난 후 Maven install을 실행합니다.


프로젝트에서 Run as - Maven build 를 선택해서 진행합니다.


Goal에서는 package를 입력해서 진행합니다.


오잉 근데...이렇게 에러가 나네요. 중간에 보시면...Perhaps you are running on a JRE ratger than a JDK? 라는 문장이 보이네요.

아무래도 JAVA옵션을 체크해봐야 겟습니다.

이클립스의 Preferences-Java-Installed JREs를 선택해서 [Add]를 눌러서 JDK를 추가합니다. 


JDK를 추가한 후 Run as - Maven Build(Goal:package)를 실행하면 다음과 같이 Build SUCCESS 메세지가 나타납니다. 


STEP4. 파일이름

이름이 맘에 안들지만 어찌 되었던 실행가능 JAR파일이 만들어졌습니다.

해당 파일을 자바가 설치된 리눅스 혹은 윈도우 에 올려놓습니다. 

일반적으로 WAS의 폴더에 놓는것을 생각하실수 있지만 잊지 말것은 이 JAR파일안에 서버가 포함되어있습니다.

Java -jar test.jar 의 명령어를 주어서 즉시 실행시켜봅니다. 




STEP5. 브라우저에서 결과 확인하기 

이제 브라우저에서 방금 프로젝트를 싱핼시켰던 결과를 확인할 수 있습니다. 

신기하네요. ㅎㅎㅎ

사실 저도 아직 이 구조에서의 클러스터링 등 여러가지 설정은 해보지 않아서 더 살펴봐야겠지만...

급하면 바로 WAR로 변경해서 예전 구조로 오기가 어렵지 않을거라고 생각됩니다.






신고

Comment +0

스프링부트 프레임워크를 사용한 입력값 검증입니다. 

일반적인 스프링 프레임워크에서도 거의 동일하게 사용이 가능할겁니다.

hibernate-validator를 사용하였습니다. 


Step1.

pom설정

프로젝트를 기본으로 생성 후 pom.xml에서는 다음과 같이 추가해줍니다. 

타임리프는 뭐 추가보다는 처음 프로젝트 생성할때 체크를 하시는게 편하겟네요. 

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>


Step2.

Data Class설정

실제 데이터를 담게 될 클래스에 어노테이션으로 유효성 체크를 해줍니다.

나중에 유효성 체크에서 오류 메세지를 커스터마이징 하기 위해서 @Size에 살펴보시면 message부분이 있습니다. 

messages.properties의 값에서 일치하는 값을 한 후 화면에 출력하게 됩니다.

package com.kiai;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class PersonForm {

    @Size(min=2, max=30, message = "{error.description}")
    private String name;

    @NotNull
    @Min(18)
    private Integer age;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String toString() {
        return "Person(Name: " + this.name + ", Age: " + this.age + ")";
    }
}



Step3.

Controller 클래스 설정

public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {


        if (bindingResult.hasErrors()) {

            return "form";

        }


이 부분을 잘 봐야 합니다. @Valid로 유효성 체크를 하겟다고 하고, 결과는 BindingResult 에 있습니다. 

메서드의 첫 부분에  if (bindingResult.hasErrors()) {~} 로 체크하여 유효성에서 오류가 발생하면 처리할 수 있도록 했습니다.

이 코드에서는 return "form"; 으로 form.html을 콜하도록 하였습니다.

package com.kiai;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Controller
public class WebController extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/results").setViewName("results");
    }

    @RequestMapping(value="/", method=RequestMethod.GET)
    public String showForm(PersonForm personForm) {
        return "form";
    }

    @RequestMapping(value="/", method=RequestMethod.POST)
    public String checkPersonInfo(@Valid PersonForm personForm, BindingResult bindingResult) {

        if (bindingResult.hasErrors()) {
            return "form";
        }

        return "redirect:/results";
    }
}


Step4.

MessageConfig 설정하기

이 예제에서는 스프링부트의 기본  MessageSource를 사용합니다.     

package com.kiai;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MessageConfig extends WebMvcConfigurerAdapter
{
    @Autowired
    private MessageSource messageSource;

    @Bean
    public LocalValidatorFactoryBean validator()
    {
        LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
        localValidatorFactoryBean.setValidationMessageSource(messageSource);
        return localValidatorFactoryBean;
    }

    @Override
    public Validator getValidator()
    {
        return validator();
    }
}


Step5.

form.html 작성

th:~로 하는것은 타임리프 엔진의 문법이다. jstl같은...그쪽을 알아보도록 하자. 

중요한것은 <input>태그 다음에 오는 <td>의 th내용들입니다. ${#fields.hasErrors('name')} name의 유효성 체크가 정상인지 if로 체크한고, th:errors="*{name}" 으로 에러가 존재시 name에 해당하는 오류 메세지를 보여주게 됩니다. 딱히, 설정을 안해도 기본적인 메세지가 언어별로 정해져있습니다. 하지만, 맘에 들기 힘들테니...저희는 이전 데이터 클래스를 보시면 message를 설정하여 커스터마이징 했습니다. 

   

<html> <meta charset="UTF-8"/> <body> <form action="#" th:action="@{/}" th:object="${personForm}" method="post"> <table> <tr> <td>Name:</td> <td><input type="text" th:field="*{name}" /></td> <td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td> </tr> <tr> <td>Age:</td> <td><input type="text" th:field="*{age}" /></td> <td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</td> </tr> <tr> <td><button type="submit">Submit</button></td> </tr> </table> </form> </body> </html>


Step6

results.html 설정

이 단계는 별거없음. 그냥 보여주기 위함.

    <html>
	<meta charset="UTF-8"/>
	<body>
		유효성 검증 통과 완료!!
	</body>
    </html>
            


Step7.

message.properties 설정하기

error.description=가나다라

기본적으로 resources폴더 밑에 message.properties를 위치합니다.




Step8. 

결과 확인




결론.

이렇게 스프링의 서버사이드 유효성 체크에 대해서 알아보았습니다. 

화면에서 하는 방법이 편하기야 하겠지만...우회하는 방법이 너무 쉽다보니 서버 측에서 유효성 체크하는 방식을 사용하는 습관을 들여야 하겠습니다. 유효성 체크의 어노테이션 사용법에 대해서 숙지할 필요가 있어 보입니다. 

신고

Comment +0

이번은 스프링 프레임워크의 스케줄 태스크에 대해서 포스팅 합니다.

시간을 일정 주기로 주고 JOB을 등록하면 정해진 주기 내지는 시간에 해당 클래스가 동작합니다.


Step1.

프로젝트 생성하기

이건 이전자료도 있고 하니...그냥 패스하겠습니다.

스프링 부트를 사용하신다면 별다르게 Dependency를 선택할 필요는 없습ㄴ디ㅏ.

Step2.

ScheduledTask 클래스 작성하기

여기 예제에서는 fixedRate로...2초 주기로 작동하게 해놓았습니다.

이 주기 부분을 보시려면 나중에 다시 정리하겠지만 cron주기 설정하는 옵션을 찾으면 됩니다.

package com.kiai.scheduled;


import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 2000)
    public void reportCurrentTime() {
        System.out.println("The time is now " + dateFormat.format(new Date()));
    }
}


Step3.

@EnableScheduling 등록하기

스프링 부트의 경우 프로젝트명의 Application에 많은 설정을 하게 되는데요.

이 예제에서는 SpringScheduledTaskApplication.java파일에 등록을 합니다. 

일반 스프링 프레임워크라면 설정하는 xml에 하게 될겁니다.

package com.kiai.scheduled;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling //여기 추가됨
public class SpringScheduledTaskApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringScheduledTaskApplication.class, args);
	}
}


Step4.

결과 확인하기 

예제에서는 단순하게 타임스탬프를 찍었지만 실제로는 주기적으로 작업을 해야하는 로직을 넣으면 될겁니다.


소스코드 별게 없지만 아래 링크서 다운가능합니다.

https://github.com/ralf79/SpringScheduledTask

신고

Comment +0

이전글인 스프링부트로 Rest Webservice만들기에 이어서...

리턴을 JSON이 아닌 XML이 필요한곳도 있을듯 해서 만들어 보았습니다.


작업 순서

프로젝트 생성은 복붙활용이다 보니..클래스 이름등은 알아서들 잘 처리하시기 바랍니다. ^^;;;;

Step1.

프로젝트 생성하기

다음의 그림과 같이 프로젝트 이름을 입력하고 [Next]버튼을 눌러서 다음으로 진행한다. 

Step2.

필요한 라이브러리 설정하기

기본적으로 Web카테고리에서 [Web]만 체크하고 [Finish]버튼을 눌러서 다음으로 진행한다. 



Step3.

클래스 생성하기

우리가 사용할 클래스는 2개이다. 

첫번재는 Controller를 담당할 RestController이고, 두번째는 화면에 리턴할 데이터를 담당할 Data 클래스이다.  

Step4.

pom.xml에 jackson-dataformat-xml관련 dependency를 설정합니다.

이전에도 말씀드렸지만...전 아재라서 Maven이 여전히 익숙하네요. 

어서...Gradle이 손에 익어야 할텐데....

       <dependencies>

<dependency>

              <groupid>com.fasterxml.jackson.dataformat</groupid>

              <artifactid>jackson-dataformat-xml</artifactid>

  </dependency>

</dependencies>



Step5.

Data를 담을 클래스를 만들어 봅니다. 

여기서는 주의할것이 데이터 클래스에 @XmlRootElement 어노테이션을 넣어주는겁니다.

package com.example;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Data {
	private String name;
	private int age;
	private String telNo;
	
	public Data(String name, int age, String telNo) {
		super();
		this.name = name;
		this.age = age;
		this.telNo = telNo;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getTelNo() {
		return telNo;
	}
	public void setTelNo(String telNo) {
		this.telNo = telNo;
	}
}


Step6.

Controller클래스를 만들어주기

이전의 Rest예제와 달리 어노테이션은 @Controller를 사용했습니다. 

package com.example;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class RestController {

	@RequestMapping(value = "/getDataXML",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_XML_VALUE)
	public @ResponseBody Data getData(@RequestParam(value="name", defaultValue="hyunwoo") String name){
		return new Data(name, 10, "010-37");
	}
	
}


Step7.

결과 확인하기 

브라우저에서 확인을 하면 www.localhost:8080/getData?name=hhh 를 입력하면 결과를 XML로 확인할 수 있습니다. 

XML의 경우 개인적으로 선호하지 않고 태그 데이터가 많아서 짜증나지만 범용적인 포맷으로 많이 사용되니 알아두어야 할듯 하긴 합니다. 


예제 관련 소스코드 

https://github.com/ralf79/SpringBootRestWebserviceXML

신고

Comment +0

원래는 Spring io의 Building a RESTful Web Service의 글인데 간단한 튜토리얼이 너무 길어서 그냥 내맘대로 편집해보았습니다.


준비물

- 스프링 프레임워크가 설치된 IDE(요새 대세는 인텔리J이지만 나는 아재이므로 SpringToolSuite)

- 이게 다임.!


작업순서

Step1.

프로젝트 생성하기

다음의 그림과 같이 프로젝트 이름을 입력하고 [Next]버튼을 눌러서 다음으로 진행한다. 

Step2.

필요한 라이브러리 설정하기

기본적으로 Web카테고리에서 [Web]만 체크하고 [Finish]버튼을 눌러서 다음으로 진행한다. 



Step3.

클래스 생성하기

우리가 사용할 클래스는 2개이다. 

첫번재는 Controller를 담당할 RestController이고, 두번째는 화면에 리턴할 데이터를 담당할 Data 클래스이다.  


이건 Data클래스 생성자와 Setter Getter를 만들어 놓았다. 

package com.example;

public class Data {
	private String name;
	private int age;
	private String telNo;
	
	public Data(String name, int age, String telNo) {
		super();
		this.name = name;
		this.age = age;
		this.telNo = telNo;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getTelNo() {
		return telNo;
	}
	public void setTelNo(String telNo) {
		this.telNo = telNo;
	}
}


이것은 RestController 클래스이다. 

URL은 localhost:8080/getData로 잡았다. 그리고 다른값들은 하드코딩을 했지만 name의 경우 URL을 통해서 입력을 받을 수 있도록 했다. 

즉, localhost:8080/getData?name=leehw 이런 식으로 입력하면 leehw라는 값이 name에 입력된다. 물론 아무값도 없을 경우는 defaultValue가 있어서 기본값이 입력된다.

package com.example;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@org.springframework.web.bind.annotation.RestController
public class RestController {

	@RequestMapping("/getData")
	public Data getData(@RequestParam(value="name", defaultValue="hyunwoo") String name){
		return new Data(name, 10, "010-37");
	}
}


Step4.

실행하기

프로젝트 이름에서 마우스 우클릭을 한후 [Run As] - [Spring boot app]을 선택하면 스프링 부트의 내장 톰캣을 활용해서 서버가 기동된다. 하단의 콘솔로그를 확인하면 서버가 정상적으로 올라오는것을 확인할 수 있다. 


Step5.

확인하기

가장 좋은 것은Advanced REST client 같은 레스트 클라이언트 프로그램을 사용하는 것이지만 굳이 귀찮으신 분들을 위해서...

브라우저에서 테스트를 하면된다. (어차피 나중에 PUT, POST, DELETE등을 하기 위해서는 Advanced REST client를 배우는게 좋타)

브라우저에서 localhost:8080/getData?name=hhh 라고 입력해보자. 다음과 같이 우리가 입력한 값이 포함되어 JSON의 형태로 나타나게 될것이다. 



최종정리

이렇게 우리는 간단하게 @RestController 어노테이션을 사용해서 json으로 리턴하는 Restful WebService만드는 방법에 대해서 알아보았다. REST에는 GET, PUT, POST, DELETE의 4가지 서비스가 있는데 우리는 이중에 GET에 대해서만 알아보았다. 




신고

Comment +0


이번 포스트는 파워포인트 사용에서 "프레젠테이션에 저장할 수 없는 글꼴이 있습니다" 라는 에러 해결방법을 공유하려합니다.

이렇게 에러가 계속나면서 파워포인트 파일이 무겁고 느려졌는데요.

아무리 찾아봐도 해당 폰트를 사용한 글씨는 없는데...해결할수가 없는겁니다.!!!



그래서 해결방법을 찾았더니 쉽지 않네요. ㅋㅋㅋ


다음의 순서대로 작업을 해주세요.


Step1

문제의 파워포인트 파일의 확장자를 zip으로 변경한다.


Step2

해당 압축파일을 압축해제 한다. 


Step3

압축을 해제한 폴더에서 ppt-slides폴더에 가서 에디터를 사용해서 슬라이드 XML파일들을 오픈한다.


Step4

모든 XML파일에서 해당 폰트의 이름을 검색해서 다른 사용하고 있는 폰트의 이름으로 변경한다. 저 같은 경우는 "나눔고딕"을 설치했기 때문에 나눔고딕으로 변경하였습니다. 변경은 찾기 힘들어서 일괄변경으로 ㄱㄱㄱ


Step5

압축파일을 풀었던 폴더를 통째로 다시 압축한다. 

Step6

압축한 파일의 확장자를 ppt 혹은 pptx로 변경하고 다시 오픈한다.  이젠 다시 해당 에러가 나오지 않으니...잘 사용하면 된다.






신고

Comment +13

안녕하세요.

진형아빠입니다.


이번에 소개해드릴 포스팅은 CommView for WiFi와 AirCrackng를 이용한 공유기의 비밀번호 해킹방법, 즉, 암호 탈취방법의 STEP BY STEP입니다.



!!!*필독!!! 참고로 여기에 나와있는 방법을 무작정 사용하시는것은 범죄가 될수 있습니다. 따라서, 학습목적으로만 사용하시고 공유기의 보안을 강화하시도록 해주세요.


사전작업

1. aircrack-ng-1.2-rc1-win 압축을 풀어 놓는다.

2. TamoSoft CommView for WiFi 를 설치한다.

  - SETUP으로 설치진행

  - Crack안의 폴더를 설치된 폴더에 copy한다.



Step1.

“Capture Data Packet” 아이콘을 체크한다.

“Logging” 탭에서 “Auto-Saving을 체크하고 200000, 100을 입력하고

로그파일 저장위치를 설정한다.


Step2.

“Node” 탭에서 우측의 “Capture”Scanner mode를 선택하고 모든 항목을 체크한다.



Step3.

붉은색 박스의 “Start capture” 버튼을 클릭하여 현재 검색이 가능한 WIFI 채널을 찾는다.

공격을 할 WIFI의 채널번호를 기억해둔다.



Step4.

Capture영역의 Single channel mode를 선택 후 기억해둔 채널번호를 선택한다.

그 후 핸드폰으로 해당 WIFI에 접속을 시도한다. (이 부분은 사실 데이터를 캡춰하면서 패스워드를 아는 사람이 접속하기를 기다리는 시나리오를 시연을 위해 변경한것임)



Step5.

접속을 시도하여 Handshake 완료된 기기의 정보가 나오게 된다.

충분히 오랜시간10분정도패킷을 캡춰해야 데이터를 기반으로 암호를 추출할수 있다.

그 후 STOP Capture를 클릭한다.



Step6.

STOP CaptureFile – Log Viewer를 선택한다.



Step7.

Log ViewerFile – Load CommView Logs를 선택한다.

Capture를 수행한 로그 중 어떤 파일을 열지 오픈하게 되는데 우리가 수행했던 가장 최근의 파일을 선택한다.



Step8.

Export Logs – WireShak/TCPDump Format을 선택해서 원하는 이름으로 저장한다.



Step9.

EncrytionWEP로 하고..Choose버튼을 선택하여 Step8에서 저장했던 *.cap파일을 선택하고 Launch버튼을 누른다


Step10.

패킷캡춰 시간이 충분했다면 Ivs의 숫자가 많이 나올것이다.

해당 WIFI SSID 를 선택한다. 



Step11.

분석 후 얼마 되지 않아 KEY FOUND와 같이 나타나며…12345 라고 하는 비번을 알아냈다



신고

Comment +22

  • start capture이 제 컴터로하면 파란색으로 안떠서 클릭할수가없습니다 왜이런가요

  • Crack안의 폴더를 설치된 폴더에 copy한다.
    이게 뭔뜻인가용

    • Crack안의 폴더를 설치된 폴더에 copy한다.
      말이 어려웠나보네요.
      1단계
      프로그램 설치후...
      2단계
      압축 풀면 나오는 Crack폴더 하위 폴더를 설치된 프로그램 위치에 덮어쓴다.

      이렇게 이해하시면 됩니다.

  • 알아 2016.08.02 22:53 신고

    Crack 안에 copy? 이게 머에요

    • Crack안의 폴더를 설치된 폴더에 copy한다.
      말이 어려웠나보네요.
      1단계
      프로그램 설치후...
      2단계
      압축 풀면 나오는 Crack폴더 하위 폴더를 설치된 프로그램 위치에 덮어쓴다.

      이렇게 이해하시면 됩니다.

  • 소나로사 2016.08.09 03:18 신고

    첨부 파일이 없나요??

  • 이해가 안돼요 2016.08.18 22:51 신고

    위에 crack 폴더는 Aircrack ng 폴더 말씀하시는걱ㄴ가요? 거기에있는 crack 폴더에다가 commview for wifi를 넣는다는 뜻인가요???

  • 모르겠어요 2016.09.05 10:31 신고

    aircrack-ng-1.2-rc1-win 이건 어디다 쓰나요?
    그리고 크랙안에 화일이 세개 들었던데 설치 폴더에 복사해도 반응이 없습니당
    commview가 실행은 되는데 왼쪽 상단의 플레이와 멈춤 버튼이 활성화가 안되네요. (기본적으로 저장이 안됨)
    조금만 더 상세히 말씀해주시면 감사하겠습니다.^^:;

    • aircrack은 나중에 commview for wifi로 수집한 데이터를 분석할때 쓰는 도구입니다.
      화일을 덮어쓰고...
      오른쪽의 와이파이를 선택한 후 왼쪽의 캡쳐 버튼을 누르셔야 할거에요.
      다시 할려면 다시 설치해야 되서...조만간 시간이 나면 유투브 동영상으로 올려보겠습니다.

  • 이우준 2016.10.29 17:09 신고

    프로그램 켠 후 50초 정도 이후에 프로그램이 응답없음 현상이 나타나는데 그건 왜그러는지 아시나요? 다른 컴퓨터도 다 마찬가지네요,,,

  • f 2017.02.19 20:44 신고

    이거해킹툴아닌가요?

  • 스나이퍼 2017.04.22 22:14 신고

    노트북으로 해보고있는데 패킷수집을 30분이상해고 키가 잘 안잡히네요 ㅜㅜ

  • 2017.05.05 11:35

    비밀댓글입니다

  • 바보지만 2017.05.14 18:06 신고

    step9번의 사진의 프로그램을 어떻게 실행시키는지, wep로 바꾸라는게 무슨소린지 잘모르겟네요 ㅠㅠ

  • tjd752 2017.05.31 23:53 신고

    setup 파일로 설치 했고 크랙 옮겼는데 플레이와 멈춤 버튼이 활성화가 되지 않아요. ㅠ.ㅠ 이거 애초에 컴퓨터 사양 같은게 정해져 있는 건가요?? 너무 답답 합니다.


    진형아빠님이 하신 말씀중에 밑에 말은 무슨뜻인지 잘 모르겠습니다.

    오른쪽의 와이파이를 선택한 후 왼쪽의 캡쳐 버튼을 누르셔야 할거에요.
    다시 할려면 다시 설치해야 되서...조만간 시간이 나면 유투브 동영상으로 올려보겠습니다.

  • 보안공부학생 2017.06.01 20:23 신고

    캡처한 .cap 파일을 선택해서 Launch 하면 아래와 같은 문구가 나옵니다.

    Failed to start Aircrack-ng.
    Aircrack-ng executable

    무엇이 원인인지 잘 모르겠습니다...

  • 첨부파일이 없어졌어요 확인좀 부탁드려요

  • 2017.06.18 21:47 신고

    압축파일은 어디있나요??

안녕하세요.

진형아빠입니다.


머신러닝을 위한 학습을 위해서 텐서플로우 관련 자료를 조회하던중 스크랩해놓고 시간이 될때 학습하려고 합니다.

http://hunkim.github.io/ml/



신고

Comment +0

티스토리 툴바