JAVA 버전이 다를 경우 맞쳐봅시다.


안녕하세요.
고코더 입니다.



 1. 다른 컴퓨터에서 개발한 프로젝트를 import 시킨후에 
톰캣으로 서버를 잡을려고 할때 등장하는 오류 메세지입니다. 저는 12버전에서 괜히 개발해서 1.8 버전에서 설정이 안되고 있네요.
Project facet Java version * is not supported

 2. 변경하시픈 프로젝트에 속성으로 이동해야 하는데요. 프로젝트를 선택후에
단축키로 ALT+ENTER 를 입력 합니다.


 3. 그리고 Project Facets 로 이동 후에 JAVA 버전을 확인해보세요. 저는 역시 12버전으로 되어 있네요.
해당 숫자를 누르면 셀렉트 박스가 나타납니다.

 4. 여기서 원하는 버전을 선택하고

 5 저장후에 종료를 하면 버전 문제로 톰캣을 설정하지 못할 일은 없습니다.



마무리

참 챙길거 많네요

댓글을 달아 주세요


자바 src 패키지가 안으로 안 들어올 때 


안녕하세요.
고코더 입니다.


 1. 이클립스에서 src 폴더 아래 class를 만들거나 패키지를 만드는건 기본입니다.
그런데 패키지를 만들면 SRC에서 클래스나 패키지를 만들면 같은 폴더 위치에서 만들어져서 당황하는 분이 계신거 같은데요.



 2. 이건 그저 이클립스 오래된 오류입니다. F5 버튼을 눌러 화면을 갱신하면 원래대로 자리가 돌아옵니다.





마무리


이 오류 같지 않은 오류 정말 오래전부터 있던거 같은데 최신 이클립스도 여전하네요



댓글을 달아 주세요


java Encoding utf-8


안녕하세요.
고코더 입니다. 




한글은 참 프로그래밍에서 불편한 언어입니다. UTF-8이 필요로 하기 때문이고 모든 언어는 영어권에서 개발되고 있어서
인코딩을 언제나 변경해줘야 하는 불편함이 있습니다. 


 1. 학습을 위하 자바 파일을 import 해서 가져왔는데 외계어가 나타납니다. 
utf-8로 변경해야 이제 우리가 읽을 수 있는 한글이 나타납니다. 

 2. 이클립스에서 Window -> Preferences 를 클릭 합니다.

 3. 그리고 General -> Content Types 를 클릭 합니다. 
그리고 Text -> Java Source File 을 클릭 합니다.  그 다음 UTF-8을 입력하고 확인을 누릅니다. 


 4. 이제 정상적으로 한글이 보입니다.!


마무리


어서 영어를 배우자!

댓글을 달아 주세요


두 개의 web.xml 비교해보자


안녕하세요.
고코더 입니다.



 1. 저번 블로그에 web-inf 아래 web.xml에 생성 방법을 글을 쓰니 두개의 xml에 대한 차이점을 물어보는 분이 계셔서 글을 남깁니다.


 2. 톰캣에 있는 web.xml 은 모든 프로젝트에 보통 기본설정(default)을 기록 합니다. 그리고 범용적인 프로젝트 설정을 기록하게 됩니다. 개발 파일을 공유할때 톰캣 파일을 함께 배포하기에 회사에서 혹은 큰 프로젝트에서 함께 써야 하는 꼭 필요한 기본설정을 기록 합니다. 범용적인 설정 위주로 기록합니다.

 3. web-inf 아래에 있는 web.xml은 해당 프로젝트에 대한 상세한(detail) 설정을 기록 합니다. 예를 들면 해당 프로젝트는 세션 타임아웃을 30초로 둔다면 여기에 기록합니다. 해당 사이트에서만 해야 하는 설정이기 때문입니다. 

모든 프로젝트에 적용할 범용설정은 config아래에 web.xml에 기록하고 
해당 프로젝트에만 사용할 기록은 web-inf 아래에 web.xml에 기록 합니다.

결론적으로 우선순위에 있는 xml은 톰캣에 있는 web-inf 입니다.
만약 같은 프로퍼티에 다른 내용이 있다면 web-inf에 있는 xml이 이를 오버라이드 합니다.

댓글로 첨언해주신 Terry 님에 자세하고 귀한 설명을 추가했습니다! 감사합니다. 언제나 부족한 설명있거나 잘못된게 있거나 궁금한게 있으면 댓글로 소통 합니다.


마무리


이런 자잘한 부분때메 자바가 복잡하죠.






댓글을 달아 주세요

  • Terry 2019.10.02 10:22  댓글주소  수정/삭제  댓글쓰기

    우연히 티스토리 글들을 보다가 이 글을 보게 되었는데요..보시는 분들이 오해의 소지가 있을것 같아서 첨언을 드립니다..
    2번에 언급했던 web.xml은 tomcat 디렉토리의 conf 디렉토리 밑에 있는 web.xml이 나오는 것인데요..
    이 web.xml의 역할은 기본설정..이란 말은 맞지만 해당 프로젝트만 그런게 아니라 모든 프로젝트에 적용되는 범용적인 설정을 여기다가 기록합니다..
    그리고 3번에 있는 web.xml은 WEB-INF 디렉토리가 있는 해당 프로젝트만 적용되는 설정을 여기에 적습니다..
    예를 들어서 세션 타임아웃을 설정하는 다음과 같은 항목이 web.xml에 있습니다..

    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>

    만약 이 항목이 2번 web.xml에 30으로 적혀있고 3번 web.xml에 20으로 적혀 있음 3번것으로 적용이 됩니다..
    그러나 2번 web.xml에 30으로 적혀있는데 3번 web.xml에는 이 설정값이 아예 없다면 2번 것으로 적용됩니다..
    거꾸로 2번 web.xml에 이 설정값이 없는데 3번 web.xml에 이 설정값이 있다면 3번 것으로 적용은 됩니다만 다른 프로젝트에서는 해당 프로젝트의 WEB-INF 디렉토리에 있는 web.xml에 이 항목이 없다면 그 프로젝트는 오류가 나겠죠..

    정리하자면 모든 프로젝트에 적용할 설정값을 2번 web.xml에 기록하고 만약 특정 프로젝트에만 다른 값을 설정하는 방식으로 override 할 경우에는 3번 web.xml에 기록하게 됩니다..

    해당 프로젝트에 대한 기본 설정, 상세 설정 개념으로 설명하실 경우 오해의 소지가 있을것 같아 주제넘게 댓글을 달았습니다..

    • Favicon of https://gocoder.tistory.com 고코더 2019.10.02 10:41 신고  댓글주소  수정/삭제

      테리님 감사합니다
      설명이 조금 부족했었는데
      첨언해주셔서 추가로 내용에 기록하여 내용을 보강했습니다^^
      감사합니다!


web.xml 생성하자


안녕하세요.
고코더 입니다.



 1. WEB-INF 아래 web.xml이 없을때가 있습니다.
초기 셋팅때는 특히나 없는 경우가 정상입니다.
이클립스에서는 간단한 방법으로 web.xml을 만드는 기능을 제공 합니다.


 2. 다이나믹 웹 프로젝트로 만든 후에 web-inf 아래 web.xml이 없습니다.

 3. 그럼 프로젝트에서 마우스 오른쪽 버튼을 누르고 
Java EE Tools -> Generate Deployment Descriptor sub 를 클릭 합니다.

 4. 그럼 자동으로 WEB-INF 아래 WEB.xml을 생성 해줍니다.


 5. 해당 파일을 열어보면 web.xml 기본 텍스트도 존재합니다.


마무리


web.xml 없다고 당황하지 마세요.



댓글을 달아 주세요


DTO 생성 


안녕하세요.
고코더 입니다.


이번에는 DTO 라는 객체에 대해서 알아봅니다. DTO(Data Transfer Object)는 VO(Value Object)라고 합니다.
계층간 데이터 교환을 위한 자바빈즈이고 컨트롤러, 뷰 계층간 데이터 교환을 위한 객체입니다.
DTO는 로직을 없고 순수한 데이터 객체만 다룹니다. getter, setter 메소드를 생성한 클래스입니다.

다시 쉽게 말하면 DAO 데이터베이스를 가져올때 사용하는 변수의 집합이라고 생각하면 쉽습니다.



 1. dto 클래스를 생성 합니다.


컨트롤러를 생성하겠습니다. 
net.gocoder.mvcboard.dto 패키지에서 class를 생성 합니다. 


클래스명은 Dto로 생성 합니다. 


package net.gocoder.mvcboard.dto;
import java.security.Timestamp;
public class Dto {
     int Idx;
     String Name;
     String Title;
     String Content;
     Timestamp Regdate;
     Timestamp Modidate;
     int Passwd;
     int Hit;
}

7~14번 라인
    - 데이터베이스에 사용할 변수들을 선언하고 해당 변수에 대해 setter, getter을 생성 합니다. 
       - 생성 방법은 책 앞면에 나와 있습니다. 


그리고 생성자를 통해 사용할 수 있도록 메소드를 하나 만들어 보겠습니다.
     public Dto() {
                     
     }
     
     public Dto(int Idx, String Name, String Title, String  Content,
                Timestamp Regdate, Timestamp Modidate, int  Passwd, int Hit ) {
           this.Idx = Idx;
           this.Name = Name;
           this.Title = Title;
           this.Content = Content;
           this.Regdate = Regdate;
           this.Modidate = Modidate;
           this.Passwd = Passwd;
           this.Hit = Hit;      
     }          

setter에 값을 넣어서 사용할 수 있게 this를 이용하여 변수를 담습니다.

이렇게해서 게시판에 사용할 Dto가 준비되었습니다.
한번 선언한 변수는 어느 곳에서나 재사용할 수 있게 됩니다.


마무리


Dto가 이해가 안되도 다음 시간에 Dao를 보면 이해가 됩니다.


댓글을 달아 주세요


setter, getter 생성 실패 할 때


안녕하세요.
고코더 입니다.

 1. 자바로 웹어플리케이션을 만들때
게터,세터는 꼭 필요한 메서드 입니다.
 2. 그런데 이걸 생성할때 아래와 같은 오류가 나는 경우가 있습니다.
The operation is not applicable to the current selection. Select a field which is not declared as type variable or a type that declares such fields.



 3. 오류에 원인은 올바른 포커스에서 해당 기능을 사용하지 않아서 입니다. 
해당 위치에서 게터,세터를 생성하면 오류가 나겠죠


 4. 게터,세터가 생성 되도 오류가 안나는 곳에서ㅁ
포커스를 맞추고 다시 실행해보세요.


그럼 정상적으로 실행 됩니다.


마무리

좋은 오류 네요.



댓글을 달아 주세요


MVC 컨트롤러(Controller) 개발


안녕하세요.
고코더 입니다.


이번 시간에는 스프링에 핵심인
컨트롤러를 만들어 보겠습니다.

이전에 설명한 거처럼 디스패처 서블릿이 컨트롤러를 호출하면 컨트롤러는 
Dao를 호출해 데이터베이스 정보를 가져오고 다시 
모델에 담아 프론트에 전달 합니다.



 1. 컨트롤러 생성


컨트롤러를 생성하겠습니다. 
net.gocoder.mvcboard.controller 패키지에서 class를 생성 합니다. 


클래스 명은 BoardController 입니다. 
게시판에 사용할 컨트롤러명 입니다. 




 2. 컨트롤러 코딩 


컨트롤러 작성을 해보겠습니다. 하나의 메소드를 작성하면 거의 비슷한 형태에
나머지도 거의 비슷한 코딩을 이어나갑니다. MVC패턴에 매력이자 어려운 규율 때문입니다.
그래도 똑같다고 방심하지 말고 복습한다는 생각으로 읽어 가보세요.

리스트 페이지 컨트롤러를 작성 해보겠습니다.
@Controller
public class BoardController {
     Command command;
     
     @RequestMapping("/list")
     public String list(Model model) {
           System.out.println("list()");
           command = new ListCommand();
           command.execute(model);
           
           return "list";
     }

17번 라인 
    - 해당 클래스를 컨트롤러 사용하기 위해 어노테이션 @Controller을 사용합니다.
    - "import org.springframework.stereotype.Controller;" 를 참조해야 합니다.
19번 라인
    - 커맨드 인터페이스를 사용하기 위해 command로 호출 합니다. 
21번 라인 
    - "/list" 접근시 해당 컨트롤러가 호출 됩니다.
23번 라인 
    - List커맨드를 가져와서 객체를 만듭니다.
    - 해당 객체에 모델을 실행합니다. 
    - 현재까지는 커맨드안에 내용들은 개발되어 있지 않습니다.
26번 라인
    - view로 모델을 전달 합니다.


글 등록 페이지 컨트롤러를 작성 해보겠습니다.
     @RequestMapping("/write")
     public String write(HttpServletRequest request, Model  model) {                   
           model.addAttribute("request", request);
           command = new WriteCommand();
           command.execute(model);
           
           return "redirect:list";
     }

29번 라인 
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
31번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
32~33번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
35번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 등록 후에 list로 페이지를 이동합니다.


글 상세 컨트롤러를 작성합니다.
     @RequestMapping(value="/modify", method=RequestMethod.POST  )
     public String modify(HttpServletRequest request, Model  model){                    
           model.addAttribute("request", request);
           command = new ModifyCommand();
           command.execute(model);
           
           return "redirect:list";
     }

38번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
40번 라인 
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
41~42번 라인 
    - 커맨드 객체를 이용해 모델을 실행합니다.
44번 라인
    - view로 모델을 전달 합니다.


글 수정 컨트롤러를 작성합니다.
     @RequestMapping(value="/modify")
     public String modify(HttpServletRequest request, Model  model){                    
           model.addAttribute("request", request);
           command = new ModifyCommand();
           command.execute(model);
           
           return "redirect:list";
     }

47번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
49번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
50~51번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
53번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 수정 후 list로 페이지를 이동합니다.

글 삭제 컨트롤러를 작성합니다.
     @RequestMapping("/delete")
     public String delete(HttpServletRequest request, Model  model) {        
           model.addAttribute("request", request);
           command = new DeleteCommand();
           command.execute(model);
           
           return "redirect:list";
     }

56번 라인
    - "/write" 접근시 해당 컨트롤러가 호출 됩니다.
58번 라인
    - request에 담긴 파라미터 값을 데이터객체를 모델에 담습니다.
59~60번 라인
    - 커맨드 객체를 이용해 모델을 실행합니다.
62번 라인
    -"redirect:" 페이지를 이동 시킵니다.
    -글 삭제 후 list로 페이지를 이동합니다.


이렇게 게시판에 필요한 모든 클래스를 만들었습니다.
처음이 어렵지만 한번 따라하다보면 컨트롤러 개발 방법이 속에 익어 갈것입니다. 



마무리


쉽지 않나요?


댓글을 달아 주세요


커맨드 생성하기 


안녕하세요.
고코더 입니다.

오늘은 서비스 객체인 command를 만들어보겠습니다.
커맨드 객체는 컨트롤러와 데이터베이스를 연결해주는 역할을 합니다. 
기본적으로 커맨드 객체는 기본 인터페이스를 통해 작동합니다.

오늘 할 작업 할 내용을 구조도로 그려보았습니다. 
커맨드는 인터페이스를 만들어서 이를 사용해
contet(상세), delete(삭제), list(목록),modify(수정)을 만들어보겠습니다.






 1. 커맨드(command) 인터페이스 생성 


마우스 오른쪽 버튼을 눌러서 new -> interface를 생성 합니다. 


인터페이스 이름은 "Command"로 생성합니다.
모든 커맨드에 기본 인터페이스로 참조될 것입니다.


그리고 안에 내용을 아래처럼 채워넣습니다. 
이 커맨드는 각 서비스 커맨드에 인터페이스로 사용 됩니다. 
import org.springframework.ui.Model;
public interface Command {
      public void execute(Model model);
}

7번 라인
    - 공통 실행을 위한 model을 선언합니다.



 2. ContentCommand - 상세보기 커맨드 생성


이번에는 게시판에서 상세보기 게시판 뷰에 해당하는 커맨드를 만들어 보겠습니다. 
해당 커맨드 패키지에서 
new -> class를 생성 합니다. 


그리고 interfaces에서 add를 클릭 합니다.
Name에는 ContentCommand


그리고 command를 검색해서 아까 만들어놓은
인터페이스를 참조하도록 설정 합니다. 


그리고 해당 command 객체에는 아래처럼 내용을 담습니다.
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class ContentCommand implements Command {
      @Override
      public void execute(Model model) {
            // TODO Auto-generated method stub
            Map<String, Object> map = model.asMap();
            HttpServletRequest request = (HttpServletRequest)  map.get("request");
            String Id = request.getParameter("Id");
      }
}

7번라인 
    - 인터페이스 Command를 Implements를 합니다. 참조합니다. 

12번 라인
    - Model에 담아온 값을 map 타입에 담습니다.
    - requetst 값을 사용하기 위해 선언합니다.
    - 그리고 컨텐츠 상세보기를 위해서 Id 값을 가져옵니다.



 3. DeleteCommand 


삭제를 담당할 커맨드 객체를 생성합니다. 생성 과정은 동일하며 코드도 같습니다.


id 값을 받아 삭제를 요청할 것입니다. 


 4. ListCommand


게시판 목록을 노출할 리스트 커맨드를 생성 합니다.


dao객체가 아직 없기에 빈 커맨드 상태로 둡니다.
package net.gocoder.mvcboard.command;
import org.springframework.ui.Model;
public class ListCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
     }
}




 5. WriteCommand


글쓰기 커맨드를 생성 합니다.


내용은 아래처럼 채워 넣습니다. 작성자,제목,내용을 받아 입력할 것입니다.
package net.gocoder.mvcboard.command;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class WriteCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
           
           Map<String, Object> map = model.asMap();
           HttpServletRequest request = (HttpServletRequest)  map.get("request");
           String Name = request.getParameter("Name");
           String Title = request.getParameter("Title");
           String Content = request.getParameter("Content");
     }
}

15~17번 라인
    - 글쓰기 내용을 가져옵니다.


 6. ModifyCommand 


수정 커맨드를 생성 합니다. 동일한 과정입니다. 


수정 커맨드는 글쓰기 커맨드에 id값을 하나 더 받아 옵니다.
package net.gocoder.mvcboard.command;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.ui.Model;
public class ModifyCommand implements Command {
     @Override
     public void execute(Model model) {
           // TODO Auto-generated method stub
           Map<String, Object> map = model.asMap();
           HttpServletRequest request = (HttpServletRequest)  map.get("request");
           String Id = request.getParameter("Id");
           String Name = request.getParameter("Name");
           String Title = request.getParameter("Title");
           String Content = request.getParameter("Content");
           
     }
}

15번 라인 
    - id 값은 조건절에 사용됩니다.
16~18번 라인
    - 수정될 정보를 받아 처리 합니다.



 7. Command 조직


해당 커맨드가 생성된 모습입니다. 게시판에 필요한 기능을 우선 만들었습니다. 
나중에 커맨드는 dao를 추가하는등에 수정을 이루어질 것입니다.



마무리


각 객체에 대한 이해도를 높히기 위해 커맨드를 일괄 생성하였습니다.



댓글을 달아 주세요


게시판 만들기 초기설정


안녕하세요.
고코더 입니다. 


스프링에 대해 알아보았고
간단한 예제로 중요한 요소들을 살펴보았습니다.
이번 시간부터 스프링 게시판을 만드는 방법을 알아보겠습니다.
기본적으로 회사에서 많이 사용하는 방식으로 구현할 것 입니다.



 1. 프로젝트 구조도




함께 만들어올 게시판에 구조도 입니다.
스프링으로 웹프로젝트를 하면 대부분 이런 구조가 나타나는데요.
이 그림은 머리속에 한번 새겨 보시고 프로젝트를 함꼐 하면서
조금씩 구체화 되어 나갈것입니다.



 2. 프로젝트 생성 


 2-1. 이번 프로젝트 이름은 MVCBoard 라고 하겠습니다.
이전 시간에 배웠던 방법대로 MVC Project를 만들어보겠습니다.


 2-2. 이번 패키지 명은 net.gocoder.mvcboard로 만들어 보겠습니다. 


 2-3. 그럼 이제 게시판을 만들 MVCBoard가 생성 됩니다. 





 3. 패키지생성


개발에 들어가기 전에 패키지를 생성합니다. 
패키지는 쉽게 말하면 폴더 입니다. 먼저 폴더를 만들어 구조도대로
개발을 준비하는 과정입니다. 

 3-1. package를 생성 하는 방법은 프로젝트에서 
new->package를 선택합니다.


 3-2. 그리고 아래처럼 입력하여 패키지를 만들겠습니다.
net.gocoder.mvcboard.command


 3-3. 그럼 이렇게 빈 패키지가 생성 됩니다. 


 3-4. 이런 방식으로 3가지 패키지를 더 생성 합니다.
net.gocoder.mvcboard.controller

net.gocoder.mvcboard.dao

net.gocoder.mvcboard.dto


 3-5. 만들어진 패키지 모습은 이런 구조가 됩니다.
빈 폴더이기에 하얀색이고 안에 파일은 아직 없습니다.



마무리


프로젝트를 생성하여 패키지를 만들었습니다.


댓글을 달아 주세요