'프로그래밍/Java'에 해당되는 글 36건

제목 날짜
  • Java Interceptor resources 및 특정 경로를 소스에서 제외하는 방법(스프링 버전 3.1.1) 2019.11.26
  • 이클립스에 작성한 프로젝트 파일을 옮기는 방법-Export -Import -Archive File 사용 2018.09.30
  • 이클립스 Cannot open Eclipse Marketplace Cannot install remote marketplace locations:Resource not found(6) 2018.09.21
  • JAVA 웹애플리케이션 설정 및 설치 하는 방법(이클립스 톰캣 연동) 2018.09.17
  • JAVA SWING 회원가입 예제 2018.09.06
  • JAVA SWING 로그인창(6) 2018.09.04
  • JAVA 서로 다른 클래스에서 private로 선언된 변수의 데이터를 가져오고 변경하는 방법 2018.08.30
  • JSmooth을 이용해 자바 파일을 JAR에서 EXE 파일로 변환하는 방법(EXE 파일 무반응)(4) 2018.08.29
  • 이클립스 자바파일 JAR 파일을 만드는 방법(2) 2018.08.28
  • 이클립스 메소드 설명이 나오지 않을때(Note: This element neither has attached source nor attached Javadoc and hence no Javadoc could be found)(2) 2018.08.09

Java Interceptor resources 및 특정 경로를 소스에서 제외하는 방법(스프링 버전 3.1.1)

Java Interceptor resources 및 특정 경로를 소스에서 제외하는 방법(스프링 버전 3.1.1)

최근에 Java 언어를 이용해 Spring 환경에서 웹페이지 기능을 만들고 있습니다. 사이트 기능 중 필요했던 기능이 로그인한 사용자만 페이지를 이용할 수 있도록 하기 위해 정보를 찾아보니 Interceptor를 활용하면 페이지 단위별로 작업을 하지 않아도 한 방에 해결할 수 있을 것 같았습니다.

Spring 프레임워크 버전별로 환경 구성이 다르기에 정보를 검색하는 것을 참고할 수 있었으나 저와 비슷한 환경에 대한 글은 대체로 많이 없었고 예외 사항도 꽤 있었던 것 같습니다.

Interceptor를 사용하기 위해서는 설정이 필요했습니다. WEB-INF/spring/servlet-context.xml 파일에 인터셉터를 사용하기 위해 아래 소스를 추가하였습니다.

	<!-- Interceptors-->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**" />
			 <bean class="com.zzarungna.controllers.InterCepter" /> 
		</mvc:interceptor>
	</mvc:interceptors>

 


인터셉터를 사용하기 위한 설정을 추가하였고 로그인된 대상만 페이지에 접근할 수 있도록  로그인하지 않은 경우 아래 소스와 같이 페이지 리다이렉트를 처리하였더니 리다이렉트 횟수가 많다고 하며 에러가 나더군요.

package com.zzarungna.controllers; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

public class InterCepter extends HandlerInterceptorAdapter{ 

@Override 
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception { 
  //로그인 세션이 없다면 login 페이지로 이동 
  String id = (String)request.getSession().getAttribute("id");

  if(id==null){ 
      response.sendRedirect("/login"); 
      return false; 
  } 

  return true; 
  } 

} 

 

문제는 로그인하지 않았을 때 로그인 페이지로 보내게 되는데 해당 페이지로 접근하여도 인터셉터에서 설정 자체를 모든 요청에 대해 인터셉터가 걸려 있기에 로그인 페이지로 보낸다고 해도 무한 리다이렉트가 걸릴 뿐 멈출 수 있는 곳이 없었습니다.

그래서 소스 수정을 통해 로그인 페이지 요청이 오는 경우는 인터셉터에서 제외해주는 수정이 필요했습니다. 그렇게 특정 경로는 예외로  처리하기 위해 인터셉터 매뉴얼을 확인해 보니 WEB-INF/spring/servlet-context.xml 파일에 exclude-mapping을 사용하면 된다고 하더군요.

소스 수정을 하고 한창 서버 재시작을 여러 차례 진행하였으나 지속해서 오류가 나고 exclude-mapping을 못 찾는다는 에러만 나더군요.

나중에 확인해 보니 exclude-mapping은 스프링 MVC 버전 3.2부터 지원이 된다고 합니다. 제가 사용하는 스프링 프레임워크 환경의 버전을 확인해보니 3.1.1 버전이더군요.

스프링 프레임워크 버전은 pom.xml 문서에서 확인이 가능하며 저의 경우는 아래 소스 코드와 같이 스프링 프레임워크 버전이 3.1.1 버전이었습니다.

 

<properties>
  <java-version>1.6</java-version>
  <org.springframework-version>3.1.1.RELEASE</org.springframework-version>
</properties>

 

특정 경로를 설정으로 지정하면 코드도 간결하고 더 좋았을 테지만 스프링 버전업을 하기 보다는 Interceptor 클래스를 이용해 특정 URL은 인터셉터 요청 항목에서 제외하는 게 좋을 것 같아 아래 소스 코드와 같이 코드를 수정하였습니다.

package com.zzarungna.controllers; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

public class InterCepter extends HandlerInterceptorAdapter{ 

@Override 
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception { 
  //로그인 세션이 없다면 login 페이지로 이동 
  String id = (String)request.getSession().getAttribute("id"); 
  String requestUrl = request.getRequestURL().toString(); 

  //로그인 경로 제외 
  if(requestUrl.contains("/login")){ 
      return true;
  } 

  //리소스 경로 제외 
  if(requestUrl.contains("/resources")){ 
      return true;
  } 

  if(id==null){ 
      response.sendRedirect("/login");
      return false; 
  } 

  return true; 
} 

} 

 

위와 같이 Interceptor 클래스에서 로그인 경로를 제외한 후 로그인하지 않은 대상이 사이트에 접근한 경우 로그인 페이지로 리다이렉트 처리를 할 수 있었습니다.

 

개인적으로 인터셉터를 활용하기 위한 클래스를 컨트롤러가 패키지가 아닌 다른 패키지에서 생성하니 제대로 작동하지 않는 문제도 있었습니다. 혹시라도 인터셉터가 제대로 동작되지 않는 분들은 인터셉터 클래스를 컨트롤러 패키지에 생성해 보시기 바랍니다.

 

resource 경로를 제외한 이유는 로그인 페이지가 웹에 표시되는데 해당 로그인 페이지에서 참조하고 있는 CSS와 Javascript 파일은 모두 resource 폴더에서 관리되고 있었기에 Interceptor에서 모든 요청을 제어하다 보니 해당 경로를 참조하고 있는 파일을 불러올 수 없어 웹페이지가 제대로 표시되지 않는 현상이 생겨 resources 경로도 인터셉터 요청에서 제외되도록 수정이 필요했습니다.

개인적으로 Java Spring Framework를 활용하며 인터셉터를 활용하면서 테스트 시간과 삽질을 하였기에 저와 비슷한 현상으로 문제를 겪고 있는 분들에게 참고하실만한 내용이 되었기를 바랍니다

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

이클립스에 작성한 프로젝트 파일을 옮기는 방법-Export -Import -Archive File 사용

이클립스에 작성한 프로젝트 파일을 옮기는 방법-Export -Import -Archive File 사용

이클립스를 사용하면서 자료 참고용이나 다시 사용할 가능성이 있는 프로젝트 파일이 이클립스 프로그램에 점차 쌓이더군요. 


그래서 이클립스 프로그램에서 여러 가지 프로젝트를 한꺼번에 백업도 하고 필요할 때 간단히 프로젝트 파일을 불러오면 무척 편할 것 같았습니다.


역시나 이클립스 프로그램에서는 해당 기능이 지원되더군요. 그래서 이클립스 프로그램에서 프로젝트 파일을 간단히 내보내고 다시 불러오는 과정을 간단히 작성해 놓으려고 합니다.


사용하면서 몇 가지 경험상으로 프로젝트 리스트가 많은 경우 한 번에 내보내기가 안되는 경우도 있습니다. 이런 경우는 프로젝트 리스트 개수를 조금 줄여서 옮기니 정상적으로 되는 경우도 있었습니다.


아래 이미지와 같이 제가 사용하는 이클립스 버전에서 다양한 프로젝트 리스트가 있습니다. 나중을 위해서 첫 번째 프로젝트를 제외하고 모두 백업하고 싶었습니다.


이클립스 프로그램에서 백업 용도나 다른 이클립스 버전으로 옮기실 프로젝트 파일을 모두 선택하시기 바랍니다.



그런 뒤에 마우스 오른쪽 버튼을 누르시고 Export 메뉴를 눌러 주시면 됩니다.



Export 메뉴 중에서 Archive File 항목을 선택하시고 Next를 눌러 주시면 됩니다.



그럼 아래 이미지와 내보낼 프로젝트 파일 리스트가 나오며 Browse를 누르셔서 내보낼 위치를 지정하시면 됩니다.



위치를 지정하시고 저장 눌러 주시면 됩니다.



그런 뒤에 Finish 버튼을 눌러 주시면 됩니다.



그럼 아래 이미지와 같이 Zip 파일 형태로 제가 Export한 파일이 하나의 zip 파일로 생성됩니다.



압축 파일을 열어 보시면 선택한 프로젝트 리스트가 zip 파일에 모두 들어가 있는 걸 확인하실 수 있습니다. 백업 용도나 다른 이클립스 버전에서 이제 import만 하시면 편하게 이전에 사용했던 프로젝트 파일을 가져오실 수 있습니다.



내보냈었었던 파일을 다시 가져 오기 위해서 임의로 프로젝트 파일을 하나 삭제하였습니다.



백업해 놓았던 프로젝트를 불러오도록 하겠습니다. Package Explorer 영역에서 마우스 오른쪽 버튼을 누르시고 import 메뉴를 선택하시면 됩니다.



import 메뉴에서 Existing Projects into Workspace 메뉴를 선택하시고 Next 버튼을 눌러 주시면 됩니다.



Select archive file에 체크가 되어 있는지 확인하시면 archive file을 선택하라고 나옵니다. 여기서 Browse 버튼을 눌러서 import할 파일을 선택 하시면 됩니다. 방금전 만들었던 archive 파일을 선택해 보도록 하겠습니다.



방금 Export 했던 zip 파일을 선택하시고 열기 눌러 주시면 됩니다.



그럼 아래 이미지와 같이 Projects 메뉴에 제가 내보냈었던 프로젝트 리스트가 나옵니다. 여기서 원하시는 프로젝트 파일만 체크 하셔서 가져오실 수도 있습니다.


자동으로 같지 않은 이름 프로젝트 리스트 하나만 선택이 되네요. 테스트로 진행한 거라 한 개의 프로젝트 파일만 임포트 하였지만 한꺼번에 내보냈던 모든 프로젝트 파일을 import 하게 되면 새로운 프로젝트를 만들지 않아도 모든 구조와 같은 상태로 프로젝트가 생성됩니다.



그럼 아래 이미지와 같이 정상적으로 import가 완료되어 이전에 사용했던 소스 파일을 쉽게 가져올 수 있습니다.



java 파일도 확인해 보니 정상적으로 import가 완료되었네요.



이클립스 프로그램을 이용해 작성했던 소스 파일을 내보내고(Export) 가져오는(import) 방법에 대해서 간단히 정리해 보았습니다.


개수가 얼마 안 되는 경우엔 Export나 import를 하지 않고 java 파일만 따로 옮기다 보니 프로젝트도 새로 만들어야 하고 JAVA 파일을 옮겨야 하다 보니 매우 불편했었는데 프로젝트 리스트가 늘어나면서 이클립스의 Export와 import를 통해 편하게 이클립스를 새롭게 받거나 다른 버전의 이클립스를 사용하게 되는 경우에도 프로젝트 파일을 편하게 가져올 수 있었습니다.


필요하신 분들은 참고하시기 바랍니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

이클립스 Cannot open Eclipse Marketplace Cannot install remote marketplace locations:Resource not found

이클립스 Cannot open Eclipse Marketplace 오류 해결방법

어는 날 Eclipse Marketplace 실행하려고 했더니 아래 이미지와 같이 Cannot install remote marketplace locations: Resource not found: http://marketplace.eclipse.org/catalogs/api/p 라는 에러가 나더군요. 



검색 사이트에서 해당 오류와 관련된 것들을 검색해보고 각종 사이트에서 안내한 대로 Network Connection도 변경해 보고 Host에 Marketplace에도 추가해 보았으나 같은 오류를 낼뿐이었습니다.



몇 시간을 날리면서 도저히 해결 방법을 못 찾고 있었는데 결국엔 해결은 했습니다. 특별한 설정을 한 것도 없었고 다른 부분은 건든 것이 없었습니다. 이클립스 파일만 3번 넘게 다시 다운받고 시도했었던 것 같습니다.



제가 문제가 되었던 부분은 이것저것 테스트해 본다고 다른 버전의 이클립스를 여러 번 설치하고 사용했던 게 문제였습니다. 이클립스 버전 중 SE 버전으로 작업을 진행하다가 웹 애플리케이션 제작을 위해서 EE 버전의 이클립스를 받다 보니 문제가 생겼던 것 같습니다.


최신 버전의 이클립스 사용 전에 이전에 사용했던 이클립스 버전과 연결된 모든 소스와 파일을 삭제하고 새롭게 새로운 버전의 이클립스를 다시 다운 받아서 진행하니 정상적으로 Eclipse Marketplace가 실행되더군요.


대표적으로 많은 해결 방법으로 Network Connections 부분을 손보라고 했지만 저는 아래 이미지와 같이 Native가 된 상태에서도 Eclipse Marketplace가 잘 실행되었습니다.



혹시나 이 방법 저 방법을 써봐도 Eclipse Marketplace 실행이 안 되는 분들은 기존에 컴퓨터에서 사용했었던 이클립스와 관련된 모든 파일과 폴더를 삭제하시고 새롭게 받은 이클립스 버전으로 한번 진행해 보시기 바랍니다.


특별한 설정을 수정하고 고친 것은 아니지만 Eclipse Marketplace 때문에 고생한 기억도 있고 많은 시간을 허비한 기억이 있어서 기록을 남기니 저와 같은 현상으로 진행이 제대로 안 되시는 분들에게 도움이 되길 바랍니다.

저작자표시비영리변경금지
  • 익명
    2020.06.02 17:34

    이 글 덕분에 2시간 헤매다가 해결했습니다ㅠㅠ 포스팅 정말 감사해요ㅠㅠ

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2020.06.03 15:48 신고

      도움이 되었다니 다행입니다. 댓글 달아 주셔서 감사합니다. :)

  • 111
    2021.11.23 13:30

    안되는데.

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2021.11.24 17:23 신고

      네 다양한 문제가 있을 수 있습니다. 개인적으로 해결한 경험을 작성한 것이기에 참고만 하시면 좋을 것 같습니다. :)

  • ddd
    2021.11.23 16:21

    이거... 이클립스 마켓서버 자체 문제일수도있어요... 가끔 그러는데 다른 사람 자리에서는 열리는지 확인해보세요~ 서버 문제면 몇시간뒤에 그냥 다시해보세요...

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2021.11.24 17:24 신고

      네 그런 경우도 있을 수 있습니다. 좋은 의견 댓글을 남겨 주셔서 정말 감사합니다. :)

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

JAVA 웹애플리케이션 설정 및 설치 하는 방법(이클립스 톰캣 연동)

JAVA 웹 애플리케이션 설정 및 설치하는 방법(이클립스 톰캣 연동)

JAVA 언어를 이용하여 로컬 환경에서 웹 애플리케이션을 구동하기 위해서 진행되는 과정을 나름대로 정리해 보려고 합니다.


웹 애플리케이션 환경을 설정하기 위해서 이클립스 다운, 톰캣 설치, 이클립스와 톰캣 서버를 연동하여 최종적으로 HTML, JSP 파일이 잘 실행 되도록 하는 것이 목표입니다.


이클립스 버전 - Version: Photon Release (4.8.0)

웹서버 버전 - Tomcat 9.0

운영체제 환경 - 윈도우10 64bit


이클립스, 웹서버, 운영체제 환경은 위와 같으며 해당 기준으로 설치 과정을 진행하고 작성하였습니다. 이클립스나, 톰캣 서버 파일을 다운 받는 사이트 화면은 시간이 지나면 사이트 구조는 변경될 수 있으니 참고하시면 좋을 것 같네요.


가장 먼저 이클립스를 다운 받기 위해서 https://www.eclipse.org/ 사이트를 접속하시면 됩니다. 사이트를 접속하시고 아래 이미지와 같이 Download 버튼을 눌러 주시면 됩니다.



그런 뒤에 Download Packages 링크 버튼을 눌러 주시면 됩니다.



이클립스 버전 중 웹 애플리케이션을 개발하고 실행하고 테스트하며 사용하기 위해서는 Eclipse IDE for Java EE Developers 버전의 이클립스를 다운 받아 주시면 됩니다. 운영체제가 윈도우10 64bit 환경이니 윈도우 64bit 라고 되어 있는 링크 버튼을 눌러 주시면 됩니다.



그런 뒤에 Download 버튼 클릭!



그럼 아래 이미지와 같이 웹 애플리케이션 구동이 가능한 이클립스 다운로드가 시작됩니다.



이클립스가 다운로드 될 동안 http://tomcat.apache.org/ 사이트에 접속해서 Apache Tomcat을 다운로드 받도록 합시다. 왼쪽 메뉴에서 최신 버전인 Tomcat9 링크 버튼을 눌러 주시면 됩니다.



다양한 파일이 있는데 가장 간단히 설치하기 위해서 압축 버전이 아닌 인스톨 설치 파일인 32-bit/64-bit Windows Service Installer 링크 버튼을 눌러 주시면 톰캣 인스톨 설치파일 다운로드가 진행됩니다.



톰캣 설치 파일이 다운로드가 완료되면 apache-tomcat-9.0.12.exe 파일을 더블클릭으로 실행해 주시면 됩니다.



기본 설정 사항으로 Next 버튼을 눌러 주시면 됩니다. 톰캣 설치 경로만 잘 기억해 놓으시면 됩니다. 기본 설치 경로는 C:\Program Files\Apache Software Foundation\Tomcat 9.0이네요.



톰캣 서버의 다운로드와 설치가 완료되면서 이클립스 다운로드도 완료되었네요. 이클립스 파일은 별다른 설치 과정 없이 압축만 해제해 주시면 됩니다.



해제한 압축 파일을 들어가 보시면 eclipse.exe 파일이 있습니다. 더블 클릭으로 실행하시면 됩니다.



이클립스에서 작성한 소스가 저장될 폴더인데 저는 기본 경로로 지정하고 진행하였습니다.


원하는 폴더에 소스 파일을 저장하시려면 Browse 버튼을 눌러 주시고 원하는 폴더를 선택 하시면 됩니다.


이클립스를 구동 할 때마다 나오는 소스 저장 창을 보지 않으시려면 Use this as the default and do not ask again 체크해 주시고 Launch 버튼 눌러 주시면 됩니다.



이클립스 초기화면인데 Workbench 버튼을 눌러서 이클립스 메인 화면으로 들어가시면 됩니다.



이클립스 화면에서 톰캣 서버와 연결을 진행하기 위해서는 상단 메뉴에서 Window 메뉴에서 Preferences 메뉴를 눌러 주시면 됩니다



이클립스 설정 창이 나오게 되는데 Server 메뉴에 Runtime Environments 메뉴를 선택하시고 오른쪽 화면에서 Add 버튼을 눌러 주시면 됩니다.



그럼 아래 이미지와 같이 서버를 선택하는 화면이 나오는데 여기서 방금 설치한 톰캣 9.0 버전을 선택하시고 Next 버튼을 눌러 주시면 됩니다.



그럼 톰캣이 설치된 경로를 선택하는 화면이 나오게 되고 여기에서 Browse... 버튼을 눌러 주시면 됩니다.



톰캣이 설치된 폴더를 선택해 주시면 됩니다. 톰캣이 설치된 기본 경로는 C:\Program Files\Apache Software Foundation\Tomcat 9.0입니다.



아래 이미지와 같이 설정이 완료되고 JRE는 Workbench default JRE로 진행하였습니다. 서버 설정이 완료되었으니 Finish 버튼을 눌러 주시면 됩니다.



그런 뒤에 Apply and Close 버튼을 눌러 주시면 됩니다.



서버 설정을 완료하시고 웹프로젝트 파일을 하나 만들어 주시면 됩니다. 왼쪽 Project Explorer 흰색 영역에 마우스 오른쪽 버튼을 누르시고 New 메뉴에서 Other... 메뉴를 선택해 주시면 됩니다.



어떤 프로젝트 파일을 만들 건지 선택하는 화면인데 Web 폴더에 Dynamic Web Project 메뉴를 선택하고 Next 버튼을 선택하시면 됩니다.



프로젝트 이름은 원하는 이름으로 지정하시고 Target runtime이 설치한 톰캣 버전으로 되어 있는지 확인하시고 Next 버튼을 눌러 주시면 됩니다.



그런 뒤에 Finish 버튼을 눌러 주시면 됩니다.



생성된 자바 프로젝트 파일을 더블 클릭해 보시면 폴더 구조가 나옵니다. 폴더 중에서 WebContent 폴더를 마우스 오른쪽 버튼으로 선택하시고 New Other.. 버튼을 선택하시면 됩니다.



테스트로 HTML 파일을 만들어서 진행해도 되지만 JSP File을 생성해서 JSP 파일도 잘 구동되는지 확인해 보려고 합니다. Web 폴더에 JSP File을 선택하시고 Next 버튼을 눌러 주시면 됩니다.



JSP 파일 이름을 원하는 이름으로 지정하시고 Finish 버튼을 눌러 주시면 됩니다. 전 기본 이름으로 파일을 생성하였습니다.



그럼 아래 이미지와 같이 JSP 파일이 생성됩니다. 아래 소스를 복사하셔서 그대로 붙여넣으셔도 되고 표시한 부분의 소스만 복사해서 붙여 소스 파일을 수정하시면 됩니다.


JAVA 함수를 이용해 현재 날짜와 시간을 출력하는 소스입니다.



<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ page import="java.util.*, java.text.*"  %>   

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

      <%   

       java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분ss초");

       String today = formatter.format(new java.util.Date());

      %>

     

      <h3>현재 시간과 날짜는 <% out.println(today); %> 입니다.</h3>

</body>

</html>



소스를 Ctrl+S를 누르셔서 저장하시고 이클립스 하단 메뉴 중에서 Servers 메뉴를 선택해 주시면 됩니다. 현재 서버가 지정되어 있지 않아 No servers are available. Click this link to create a new server... 라고 나오고 이 글자에 링크가 걸려 있습니다. 링크 버튼을 누르시면 서버를 등록하는 화면이 나옵니다.



설치한 톰캣 v9.0 Server를 선택하시고 Next 버튼을 눌러 주시면 됩니다.



그런 뒤에 현재 프로젝트 파일을 왼쪽에서 Add 버튼을 눌러서 왼쪽에서 오른쪽으로 방금 생성한 프로젝트를 옮겨 주시고 Finish 버튼 눌러 주시면 됩니다.



서버 설정 및 등록이 완료되었으니 단축키 Ctrl+F11이나 상단에 Run 메뉴에서 Run 메뉴를 선택해 주시면 됩니다.



그럼 실행이 되어야 하는데 Starting Tomcat v9.0 Server at localhost' has encountered a problem. 이라고 나오고 서버 포트 번호가 나오면서 에러가 납니다. 


톰캣을 인스톨 버전으로 설치하다 보니 윈도우에서 이미 설치 이후에 톰캣 서버가 실행이 되고 있는 상태에서 이클립스에서 실행 하려다 보니 실행이 정상적으로 진행이 되지 않습니다.


OK 버튼 누르시면 됩니다.



윈도우 바탕 화면에서 설치된 Aparche Tomcat 9.0 Tomcat9 아이콘을 마우스 오른쪽 버튼으로 선택하시면 됩니다.



Stop service 버튼을 눌러 주시면 윈도우에서 실행되는 톰캣 서버는 종료됩니다.



위 방법으로 진행하셔도 되고 서비스 설정에서 진행하셔도 됩니다. 편하신 방법으로 진행하시면 됩니다. 윈도우키를 눌러서 검색에서 서비스를 검색하여 선택하시면 됩니다.



서비스 목록 중에서 Apache Tomcat 9.0 Tomcat9을 더블 클릭해 주시면 됩니다.



아래 이미지와 같이 윈도우 구동 시에 자동으로 톰캣 서버가 실행되지 않도록 시작 유형 메뉴에서 수동 메뉴를 선택하고 확인 버튼을 눌러 주시면 됩니다.



윈도우 작업 표시줄에 톰캣 아이콘이나 윈도우 서비스를 이용해서 설정이 완료되셨다면 다시 이클립스로 돌아와서 Ctrl+F11이나 Run 메뉴에 Run 메뉴를 눌러 주시면 됩니다. 



서버 실행 시에 매번 같은 과정을 거쳐야 하니 Always use this server when running this project에 체크하고 진행하셔도 됩니다.



그럼 아까 보던 에러는 사라지고 윈도우 방화벽 허용 여부가 나옵니다. 액세스 허용을 눌러 주시면 됩니다.



이클립스에서 서버를 실행하면 아래 이미지와 같이 현재 날짜 시간이 출력됩니다. 현재 날짜와 시간이 잘 출력되고 HTML 태그도 정상적으로 나오는 것을 확인했으니 문제없이 웹 서비스 관련 코딩을 하시면 되겠네요.


인터넷 브라우저에서도 잘 실행이 되는지 확인하기 위해서 빨간색 네모 칸 영역에 전체 경로를 복사해 놓으시기 바랍니다.



크롬, 익스플로러, 사파리, 파이어폭스 등 브라우저를 실행하고 주소창에 복사한 경로를 붙여넣어서 엔터를 눌러 실행해 보면 브라우저에서도 잘 실행이 되는 것을 확인하실 수 있습니다.



나름대로 로컬 환경에서 이클립스와 톰캣을 연동하여 웹 애플리케이션을 구동하기 위한 과정을 나름대로 정리해 보았습니다. 처음 설정을 하시는 분이나 설정하면서 궁금했던 분들이 있다면 도움이 되는 정보이길 바라면서 작성을 마칩니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

JAVA SWING 회원가입 예제

JAVA SWING 회원가입 예제

JAVA SWING을 이용해서 회원가입 예제를 간단히 만들어 보았습니다. 프로그램 흐름은 메인 화면에서 버튼을 눌렀을 때 회원가입 화면이 나오게 되며 회원가입 다이얼로그 화면에서 회원 정보를 입력하고 회원가입 버튼을 눌렀을 다이얼로그 창에 입력한 정보를 메인 화면에 값을 가져오는 것까지 작성하였습니다. 


프로그램 흐름은 간략히 위와 같으며 dialog, main 패키지를 각각 만들어서 main 패키지에는 TestMain.java 파일을 만들었으며 dialog 패키지에는 SignUpDialog.java 파일을 만들었습니다. 


회원가입 다이얼로그 창 텍스트 필드에 기본 아이디 값을 보여주고 포커스 이벤트가 발생 되었을 때 해당 필드에 값을 지워 주었습니다. 회원가입 텍스트 필드에 모든 값이 입력되었는지 확인하는 메소드도 따로 작성하였습니다. 


포커스 이벤트 모음 메소드 - FocusEvent()

텍스트 필드에 값을 모두 입력 하였는지 체크하는 메소드 - checkValue()



소스도 직접 복사해서 붙여넣을 수 있도록 작성하였으며 파일 자체도 다운로드 받을 수 있도록 자바 파일도 업로드 하였습니다.

TestMain.java


Exam 프로젝트에 main 패키지

  TestMain.java

package main;


import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import dialog.SignUpDialog;


public class TestMain extends JFrame{

private JPanel mainPanel = new JPanel(new GridLayout(17, 0));

private JLabel idlabel = new JLabel("다이얼로그에서 받아온 아이디 값");

private JTextField idText = new JTextField();

private JLabel pwlabel = new JLabel("다이얼로그에서 받아온 비밀번호 값");

private JTextField pwText = new JTextField();

private JLabel pwchecklabel = new JLabel("다이얼로그에서 받아온 비밀번호 확인 값");

private JTextField pwCheckText = new JTextField();

private JLabel namelabel = new JLabel("다이얼로그에서 받아온 이름 값");

private JTextField nameText = new JTextField();

private JLabel birthYearlabel = new JLabel("다이얼로그에서 받아온 생일 연도 값");

private JTextField birthYearText = new JTextField();

private JLabel birthMonthlabel = new JLabel("다이얼로그에서 받아온 생일 월 값");

private JTextField birthMonthText = new JTextField();

private JLabel birthDaylabel = new JLabel("다이얼로그에서 받아온 생일 일자 값");

private JTextField birthDayText = new JTextField();

private JLabel phoneNumberlabel = new JLabel("다이얼로그에서 받아온 핸드폰 번호 값");

private JTextField phoneNumberText = new JTextField();

private JButton signUpbtn = new JButton("다이얼로그 창에서 회원 가입 정보 입력 하기 위한 버튼!");

private TestMain owner = this;

public TestMain() {

super("메인창");

this.mainPanel.add(idlabel);

this.mainPanel.add(idText);

this.mainPanel.add(pwlabel);

this.mainPanel.add(pwText);

this.mainPanel.add(pwchecklabel);

this.mainPanel.add(pwCheckText);

this.mainPanel.add(namelabel);

this.mainPanel.add(nameText);

this.mainPanel.add(birthYearlabel);

this.mainPanel.add(birthYearText);

this.mainPanel.add(birthMonthlabel);

this.mainPanel.add(birthMonthText);

this.mainPanel.add(birthDaylabel);

this.mainPanel.add(birthDayText);

this.mainPanel.add(phoneNumberlabel);

this.mainPanel.add(phoneNumberText);

this.mainPanel.add(signUpbtn);

this.setContentPane(mainPanel);

this.setSize(500,500);

this.setVisible(true);

this.setLocationRelativeTo(null);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//회원가입 버튼을 눌렀을때 회원가입 다이얼로그 창 생성

signUpbtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

SignUpDialog signup = new SignUpDialog(owner);

signup.setVisible(true);

//메인 창에서 회원가입 입력이 모두 완료 되었는지 체크하는 것은 membershipProgress로 판단

if(signup.memberCheck()) {

idText.setText(signup.getIdText());

pwText.setText(signup.getPwText());

pwCheckText.setText(signup.getPwCheckText());

nameText.setText(signup.getNameText());

birthYearText.setText(signup.getBirthYearText());

birthMonthText.setText(signup.getBirthMonthContent());

birthDayText.setText(signup.getBirthDayText());

phoneNumberText.setText(signup.getPhoneNumberText());

}

}

});

}

public static void main(String[] args) {

new TestMain();

}

}




회원가입 다이얼로그 자바 파일도 업로드 하였으며 소스도 복사하여 사용하실 수 있도록 작성하였습니다.

SignUpDialog.java


Exam 프로젝트에 dialog 패키지에 SignUpDialog.java

package dialog;


import java.awt.*;

import java.awt.event.*;

import javax.swing.*;


public class SignUpDialog extends JDialog{

private JPanel signUpPanel = new JPanel(new GridLayout(11, 0));

private JTextField idText = new JTextField("아이디");

private JPasswordField pwText = new JPasswordField();

private JPasswordField pwCheckText = new JPasswordField();

private JTextField nameText = new JTextField("이름");

private JTextField birthYearText = new JTextField("생일 년도");

private String[] birthMonthContent = {"생일 월","1","2","3","4","5","6","7","8","9","10","11","12"};

private JComboBox<String> birthMonthList = new JComboBox<>(birthMonthContent);

private JTextField birthDayText = new JTextField("생일 일자");

private JTextField phoneNumberText = new JTextField("핸드폰 번호");

private JButton signUpbtn = new JButton("회원가입");

private JLabel pwlabel = new JLabel("비밀번호");

private JLabel pwChecklabel = new JLabel("비밀번호 확인");

private boolean membershipProgress = false;


public SignUpDialog(Frame frame) {

super(frame, true);

this.setTitle("회원가입");

this.signUpPanel.add(idText);

this.signUpPanel.add(pwlabel);

this.signUpPanel.add(pwText);

this.signUpPanel.add(pwChecklabel);

this.signUpPanel.add(pwCheckText);

this.signUpPanel.add(nameText);

this.signUpPanel.add(birthYearText);

this.signUpPanel.add(birthMonthList);

this.signUpPanel.add(birthDayText);

this.signUpPanel.add(phoneNumberText);

this.signUpPanel.add(signUpbtn);

this.setContentPane(signUpPanel);

this.setSize(300,500);

this.setLocationRelativeTo(null);


FocusEvent();

checkValue();

}

//텍스트 필드에 있는 값을 체크하고 지우기 위한 메소드

private void FocusEvent() {

idText.addFocusListener(new FocusListener() {

public void focusLost(FocusEvent e) {

if(idText.getText().trim().length()==0) {

idText.setText("아이디");

}

}

public void focusGained(FocusEvent e) {

if(idText.getText().trim().equals("아이디")) {

idText.setText("");

}

}

});

nameText.addFocusListener(new FocusListener() {

public void focusLost(FocusEvent e) {

if(nameText.getText().trim().length()==0) {

nameText.setText("이름");

}

}

public void focusGained(FocusEvent e) {

if(nameText.getText().trim().equals("이름")) {

nameText.setText("");

}

}

});

birthYearText.addFocusListener(new FocusListener() {

public void focusLost(FocusEvent e) {

if(birthYearText.getText().trim().length()==0) {

birthYearText.setText("생일 년도");

}

}


public void focusGained(FocusEvent e) {

if(birthYearText.getText().trim().equals("생일 년도")) {

birthYearText.setText("");

}

}

});

birthDayText.addFocusListener(new FocusListener() {

public void focusLost(FocusEvent e) {

if(birthDayText.getText().trim().length()==0) {

birthDayText.setText("생일 일자");

}

}


public void focusGained(FocusEvent e) {

if(birthDayText.getText().trim().equals("생일 일자")) {

birthDayText.setText("");

}

}

});

phoneNumberText.addFocusListener(new FocusListener() {

public void focusLost(FocusEvent e) {

if(phoneNumberText.getText().trim().length()==0) {

phoneNumberText.setText("핸드폰 번호");

}

}


public void focusGained(FocusEvent e) {

if(phoneNumberText.getText().trim().equals("핸드폰 번호")) {

phoneNumberText.setText("");

}

}

});

}

//회원 가입할때 모든 값이 입력되었는지 체크하기 위한 메소드

private void checkValue(){

signUpbtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

if(idText.getText().trim().length()==0 || idText.getText().trim().equals("아이디")) {

JOptionPane.showMessageDialog(null, "아이디를 입력해 주세요.", "아이디 입력", JOptionPane.WARNING_MESSAGE);

idText.grabFocus();

return;

}

if(pwText.getText().trim().length()==0) {

JOptionPane.showMessageDialog(null, "비밀번호를 입력해 주세요.", "비밀번호 입력", JOptionPane.WARNING_MESSAGE);

pwText.grabFocus();

return;

}

if(pwCheckText.getText().trim().length()==0) {

JOptionPane.showMessageDialog(null, "비밀번호 확인을 입력해 주세요.", "비밀번호 확인 입력", JOptionPane.WARNING_MESSAGE);

pwCheckText.grabFocus();

return;

}

if(!(pwText.getText().trim().equals(pwCheckText.getText().trim()))) {

JOptionPane.showMessageDialog(null, "비밀번호가 같지 않습니다.!!", "비밀번호 확인", JOptionPane.WARNING_MESSAGE);

return;

}

if(nameText.getText().trim().length()==0 || nameText.getText().trim().equals("이름")) {

JOptionPane.showMessageDialog(null, "이름을 입력해 주세요.", "이름 입력", JOptionPane.WARNING_MESSAGE);

nameText.grabFocus();

return;

}

if(birthYearText.getText().trim().length()==0 || birthYearText.getText().trim().equals("생일 년도")) {

JOptionPane.showMessageDialog(null, "생년월일의 생일 년도를 입력해 주세요.", "생일 년도 입력", JOptionPane.WARNING_MESSAGE);

birthYearText.grabFocus();

return;

}

if(birthMonthList.getSelectedIndex()==0) {

JOptionPane.showMessageDialog(null, "생년월일의 월을 선택해 주세요.", "월 입력", JOptionPane.WARNING_MESSAGE);

birthMonthList.grabFocus();

return;

}

if(birthDayText.getText().trim().length()==0 || birthDayText.getText().trim().equals("생일 일자")) {

JOptionPane.showMessageDialog(null, "생일 일자를 입력해 주세요.", "생일 일자 입력", JOptionPane.WARNING_MESSAGE);

birthDayText.grabFocus();

return;

}

if(phoneNumberText.getText().trim().length()==0 || phoneNumberText.getText().trim().equals("핸드폰 번호")) {

JOptionPane.showMessageDialog(null, "핸드폰 번호를 입력해 주세요.", "핸드폰 번호 입력", JOptionPane.WARNING_MESSAGE);

phoneNumberText.grabFocus();

return;

}

//여기까지 왔다면 모든 값을 입력하고 선택하는 것이 완료되었으니 회원가입 과정이 완료.

membershipProgress = true;

setVisible(false);

}

});

}

//메인 클래스에서 다이얼로그 회원가입 창 데이터를 가져오기 위한 get 메소드 선언

public String getIdText() {

return this.idText.getText().trim();

}


public String getPwText() {

return this.pwText.getText().trim();

}


public String getPwCheckText() {

return this.pwCheckText.getText().trim();

}


public String getNameText() {

return this.nameText.getText().trim();

}


public String getBirthYearText() {

return this.birthYearText.getText().trim();

}


public String getBirthMonthContent() {

return this.birthMonthList.getSelectedItem().toString();

}


public String getBirthDayText() {

return this.birthDayText.getText();

}


public String getPhoneNumberText() {

return this.phoneNumberText.getText().trim();

}


public boolean memberCheck() {

return membershipProgress;

}

}



아래 이미지와 같이 메인 창 화면에서 버튼을 누르면 회원가입 다이얼로그 창이 나오게 됩니다 값들은 비어 있는 상태입니다.



회원가입 창 다이얼로그 화면인데 각각의 텍스트 필드에 있는 값을 미리 넣어 놓고 해당 텍스트 필드에 값을 입력하려고 할 때 기존에 값을 삭제하기 위해 텍스트 필드에 포커스 이벤트로 기존에 텍스트 필드에 값을 지우고 값을 입력하지 않았을 때 다른 곳을 클릭 했을 때는 기본값이 다시 나오도록 작성하였습니다.



회원가입 다이얼로그 창에서 모든 값을 입력하고 회원가입 버튼을 눌러 줍니다.



그럼 회원가입 다이얼로그 화면에서 회원가입 버튼을 눌렀을 때 메인 프레임 화면에서 회원가입 창에서 입력한 값이 표시됩니다.



JAVA SWING을 이용해 메인 프레임 화면에서 JDialog 화면에 입력된 값을 가져오는 부분과 모든 예외 처리를 상세하게 모두 처리하지는 않았지만, 간단히 필요한 예외 처리 부분까지 소스를 작성하였습니다. 


JAVA SWING을 이용해서 회원가입 예제가 필요한 분들은 참고하시면 좋을 것 같습니다.

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

JAVA SWING 로그인창

JAVA SWING 로그인창

JAVA의 SWING을 이용해 간단히 로그인 창을 만드는 예제를 직접 작성해 보았습니다. SWING으로 작성된 로그인 창 소스가 필요하신 분들이 있다면 참고하시면 좋을 것 같습니다.


아이디는 test 비번은 test1로 값을 입력하고 로그인 버튼을 눌렀을 때 간단히 알람 창을 보여주는 형태로 만들었습니다.


이클립스에서 작성한 SWING 로그인 창 예제 소스 화면입니다. 혹시라도 필요한 분이 있을까 봐 첨부합니다.



패키지는 default package에 넣어서 패키지 구문이 없으며 패키지에 포함 시키려면 간단히 import 구문 위에 넣어 주시면 됩니다. 소스도 올리고 파일도 올릴게요~

login.jar


SwingLogin.java



SwingLogin.JAVA


//package 패키지명

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;


public class SwingLogin extends JFrame{

private JPanel loginPanel = new JPanel(new GridLayout(3, 2));

private JLabel idLabel = new JLabel("아이디 ");

private JLabel pwLabel = new JLabel("비밀번호 ");

private JTextField idText = new JTextField();

private JPasswordField pwText = new JPasswordField();

private JButton loginBtn = new JButton("로그인");

private JButton idpwSearchBtn = new JButton("아이디/비밀번호 찾기");


public SwingLogin() {

super("로그인 창!");

this.setContentPane(loginPanel);

loginPanel.add(idLabel);

loginPanel.add(pwLabel);

loginPanel.add(idText);

loginPanel.add(pwText);

loginPanel.add(idpwSearchBtn);

loginPanel.add(loginBtn);


//라벨 가운데 정렬

idLabel.setHorizontalAlignment(NORMAL);

pwLabel.setHorizontalAlignment(NORMAL);


//현재 프레임 창 가운데 정렬 setSize를 먼저 해주어야 정상적으로 프레임이 가운데 정렬이 됨!

setSize(350,150);

this.setLocationRelativeTo(null);

this.setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


//로그인 버튼을 눌렀을때

loginBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {


//아이디 비번 확인 테스트 코드~

String id = idText.getText().trim();

String pw = pwText.getText().trim();


if(id.length()==0 || pw.length()==0) {

JOptionPane.showMessageDialog(null, "아이디 또는 비밀번호를 입력 하셔야 됩니다.", "아이디나 비번을 입력!", JOptionPane.DEFAULT_OPTION);

return;

}


if(id.equals("test") && pw.equals("test1")) {

JOptionPane.showMessageDialog(null, "로그인 성공", "로그인 확인!", JOptionPane.DEFAULT_OPTION);

return;

}


JOptionPane.showMessageDialog(null, "로그인 실패", "로그인 확인!", JOptionPane.DEFAULT_OPTION);

}

});


//아이디 비밀번호 찾기 버튼을 눌렀을때

idpwSearchBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JOptionPane.showMessageDialog(null, "아이디 비번 찾기 기능~~", "아이디/비밀번호 찾기", JOptionPane.DEFAULT_OPTION);

}

});

}

public static void main(String[] args) {

new SwingLogin();

}

}



프로그램 실행할 때에 중앙에 위치되고 첫 실행 화면 이미지 첨부



로그인 실패시 showMessageDialog를 이용해 알림 창을 출력 하였으며 아이디, 비밀번호 텍스트 필드에 있는 값을 가져오고 해당 값을 체크 하는 소스를 간단히 작성.



아이디 텍스트 필드에 있는 값이 test 비밀번호 텍스트 필드에 값이 test1일때 showMessageDialog를 이용해 로그인 성공 알림 창을 출력 메시지를 보여주는 코드를 추가.



아이디 비밀번호 찾기 버튼과 로그인 버튼을 눌렀을 때 ActionListener를 통해서 버튼을 눌렀을때 처리되는 코드를 작성 하였습니다. SWING을 처음 접하시는 분 중에서 참고 자료가 필요하신 분들은 소스를 보시고 참고하시면 좋을 것 같습니다~

저작자표시비영리변경금지
  • 익명
    2019.11.16 18:45

    비밀댓글입니다

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2019.11.17 16:22 신고

      블로그에 올려놓은 파일은 소스코드만 참고 하시라고 올려놓은 파일입니다.

      이클립스에서 해당 소스코드를 작성하고 실행 하셔야 swing 화면을 확인할 수 있습니다.

      필요하실 것 같아 jar 파일도 따로 파일을 올려 놓았고 자바 코드로 작성한 코드를 exe 실행 파일로 만드는 방법도 이전에 작성한 적이 있으니 참고 하시면 도움이 되실 겁니다. https://zzarungna.com/1273

      추가로 jar를 실행하기 위해서는 java 설치가 필요하다는 내용이 나오실 수 있습니다.

      한마디로 자바 + 이클립스 환경을 세팅 하시고 실행 하시면 해당 화면을 눈으로 확인 가능 합니다.

  • 코딩 어려워ㅜㅜ
    2021.06.17 15:44

    ㅠㅠㅠㅠㅠ 감사하비다 로그인 예제 찾아도 에러나는 경우 많앗는데 이건 잘 작동하네요 ㅠㅠ

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2021.06.18 23:08 신고

      오류없이 잘실행되어 다행입니다!! 댓글 남겨 주셔서 감사합니다. :)

  • 익명
    2022.02.15 03:03

    비밀댓글입니다

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2022.02.18 12:43 신고

      혹시 private JPasswordField pwText = new JPasswordField(); 구문을 통해 패스워드 필드를 생성 하셨나요?

      질문 내용을 보면 pwText 변수에 패스워드필드를 담는 부분이 있는데 해당 부분을 확인해 보셔야 될것 같습니다~

      pwText 변수엔 생성한 패스워드 필드의 공백을 제거해 값을 가져오는 부분인데 잘안되시면 private JPasswordField pwText = new JPasswordField(); 이부분을 private JPasswordField pwText = new JTextField(); 필드로 생성하시고 테스트 해보시면 좋을 듯 합니다. :)

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

JAVA 서로 다른 클래스에서 private로 선언된 변수의 데이터를 가져오고 변경하는 방법

JAVA 서로다른 클래스에서 private로 선언된 변수의 데이터를 가져오고 변경하는 방법

JAVA 프로그래밍을 하면서 클래스가 다른 자바 파일에서 private로 선언된 변수의 데이터를 가져오거나 변경하고 싶을 때 나름대로 쉽게 알아볼 수 있도록 예제를 만들어 보았습니다.


어려운 내용은 아니지만 처음 자바 프로그래밍을 접하고 이론을 배우고 막상 무언가를 만들려고 할 때 대부분 다른 클래스에 선언된 변수의 데이터를 가져오고 변경하는 방법을 헷갈리시는 분들이 조금 있을 거라고 생각합니다.


아래 이미지와 같이 Aaaaa 라는 클래스가 있고 Bbbbb라는 클래스가 있습니다. 대부분 프로젝트나 어떠한 프로그램을 만들 때 아래 이미지와 같이 생성자에서 데이터를 가져오고 변경하여 처리를 많이 하게 되다 보니 배운 내용임에도 불구하고 사용법이 다르다 보니 헷갈리는 분들도 꽤 있는 것 같습니다. 


아래 이미지와 같이 Bbbb클래스에 있는 변수에 데이터를 다른 클래스에서 가져와서 사용하고 변경하고 싶을 때 B 클래스에 선언된 변수가 public이라면 다른 클래스에서 B 클래스 객체를 생성하고 get이나 set 메소드 없이도 접근이 가능합니다.


하지만 대부분 클래스를 만들 때 private로 변수를 선언하기 때문에 반드시 다른 클래스에서 B 클래스에 있는 변수의 데이터를 가져오거나 변경해 주시려면 get(), set() 메소드로만 데이터를 가져오고 변경하실 수 있습니다.


그래서 B 클래스의 데이터를 가져오기 위해서 가장 먼저 B 클래스 객체를 생성해 주셔야 접근이 가능하기 때문에 B 클래스 객체를 생성해 주셔야 합니다.


그런 뒤에 생성한 B 클래스의 데이터를 제공하기 위해서 만든 get 메소드와 set 메소드를 통해서 다른 클래스에서도 자유롭게 B 클래스 객체를 생성만 해주신다면 B 클래스의 데이터를 가져오고 변경하실 수 있습니다.



만약 B 클래스가 public으로 선언된 변수라면 get set 메소드가 없어도 다른 클래스에서 데이터 접근이 가능합니다. A클래스에서 객체를 생성하고 get이나 set 메소드를 통해서 데이터를 가져오고 변경하는 것이 아니라 객체만 생성하게 되면 get(), set() 메소드가 없어도 B 클래스에 있는 데이터를 가져오고 수정 할 수 있습니다.


아래 이미지는 B 클래스가 public으로 멤버 변수가 사용된 경우 다른 클래스에서 B 클래스에 있는 데이터를 가져오는 코드입니다.



위 내용을 보면 그럼 public으로 선언해서 사용하면 되지 않나? 왜 private로 사용하는 거지? 궁금하신 분들은 아래 링크된 글을 참고하시면 멤버 변수를 public보다는 private 접근 지정자로 변수를 사용하는 이유에 대해서 어느 정도 감을 잡으실 수는 있을 것 같습니다. - https://kldp.org/node/48605


Aaaaa.JAVA

package test;

 

public class Aaaaa {

    

     public Aaaaa() {

           Bbbbb b = new Bbbbb();

          

           //다른 클래스에 있는 데이터를 가져올땐 B클래스 객체를 생성하고 get 메소드로 데이터를 가져옴

           System.out.println(b.getBdata());

           System.out.println(b.getBnum());

          

           //다른 클래스에서 B 클래스의 데이터를 변경하고 싶을땐 set 메소드로 데이터 변경 가능~

           b.setBdata("다른 클래스에서 B클래스에 데이터를 변경~");

           b.setBnum(999999999);

          

           //변경후

           System.out.println(b.getBdata());

           System.out.println(b.getBnum());

     }

    

     public static void main(String[] args) {

           Aaaaa a = new Aaaaa();

     }

}

 




Bbbbb.JAVA

package test;

 

public class Bbbbb {

     // Bbbb클래스

     private String bdata = "b클래스의 bdata";

     private int bnum = 1004;

          

     public String getBdata() {

           return bdata;

     }

     public void setBdata(String bdata) {

           this.bdata = bdata;

     }

     public int getBnum() {

           return bnum;

     }

     public void setBnum(int bnum) {

           this.bnum = bnum;

     }

    

    

}

 



어려운 내용은 아니지만 이런 내용에 글도 있으면 좋을 것 같아서 나름대로 간단히 한번 작성해 보았습니다. 혹시라도 다른 클래스에 있는 데이터를 어떻게 가져오고 변경해야 하는지 궁금하셨던 분들에게 조금이라도 도움이 되는 내용이었기를 바랍니다. :)

저작자표시비영리변경금지

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

JSmooth을 이용해 자바 파일을 JAR에서 EXE 파일로 변환하는 방법(EXE 파일 무반응)

JSmooth을 이용해 자바 파일을 JAR에서 EXE 파일로 변환하는 방법(EXE 파일 무반응)

이전에 자바 파일을 JAR 파일로 만드는 방법에 대해서 간단히 정리하여 작성한 글이 있습니다. JAVA 파일을 EXE 실행 가능한 파일로 변환하시려면 먼저 JAR 파일을 만드셔야 합니다.


EXE 파일을 만들기 위해서는 반드시 이클립스 툴을 이용해 JAR 파일로 내보내는 방법에 대한 글을 반드시 참고하셔서 먼저 JAR 파일을 만들어 주시고 오시면 됩니다. (http://zzarungna.tistory.com/1272)


작성하는 기준은 JSmooth를 이용하는 방법으로 작성하며 JSmooth 0.9.9-7 버전이며 진행하며 보니 여러 가지 오류가 있더군요. 오류 발생 원인과 오류가 있을 때 해결하는 방법도 같이 작성하였습니다.


JAR 파일을 만드셨다면 http://jsmooth.sourceforge.net/ 사이트에 접속하시기 바랍니다. 사이트에 접속하시고 Download 메뉴 버튼을 눌러 주시면 됩니다.



그런 뒤에 아래 이미지와 같이 visit the download page 링크 버튼을 눌러 주시면 됩니다.



다운로드 링크 페이지로 연결이 되는데 이곳에서 Download Latest Version 버튼을 눌러 주시면 됩니다.



잠시 기다리시면 다운로드가 시작됩니다. JSmooth 설치 파일이 다운로드 될 때까지 기다리시면 됩니다.



다운로드 받은 jsmooth 파일을 더블 클릭하고 실행하시고 별다른 설정 없이 Next 버튼만 눌러 주시면 됩니다.



설치가 완료되고 조금 기다리시면 아래 이미지와 같이 JSmooth 창이 나오게 됩니다. 로딩이 생각보다 많이 깁니다.



조금 기다리시면 아래 이미지와 같이 프로그램 화면이 나옵니다. 제가 만든 JAR 파일은 SWING으로 작성된 파일이며 해당 자바 파일을 이용해 AWT와 콘솔이 아닌 SWING 기준으로 EXE 파일을 만들기 때문에 저와 사용방법이 다를 수 있는 점은 참고하시면 좋을 것 같습니다.


가장 먼저 Skeleton 메뉴를 선택하시면 됩니다. Skeleton Selection 메뉴에서 Windowed Wrapper 메뉴를 선택하시면 됩니다. 그런 뒤에 Launch java app in the exe process 메뉴를 체크해 주시면 됩니다.



두 번째 메뉴인 Executable 메뉴를 선택하시기 바랍니다. exe 파일이 생성될 위치를 지정해 주시기 위해서 점 3개로 이루어진 버튼을 눌러 주시고 생성할 exe 파일 이름을 지정하시고 Select 버튼을 눌러 주시면 됩니다.



그런 뒤에 1. Application 메뉴를 선택하시고 2. Use an embedded jar를 체크해 주시면 됩니다. 3. 생성한 jar 파일을 찾기 위해 버튼을 눌러 주시고 4. 생성한 jar 파일을 선택하시고 5. select 버튼을 눌러 주시면 됩니다.



그럼 아래 이미지와 같이 EXE 파일로 변환할 JAR 파일의 경로가 나오게 됩니다. 여기서 Main class를 반드시 지정해 주셔야 합니다. Main Class를 선택하기 위해서 점 3개로 이루어진 버튼을 눌러 주시면 jar 파일에 들어있는 클래스 파일을 선택하실 수 있습니다.


아래 이미지와 Main class를 선택할 수 있는 폴더가 나오면 더블 클릭해 주시면 됩니다.



저와 같은 경우는 main 클래스가 smilebook 패키지 안에 있습니다. 아래 이미지와 같이 SmileBook main 클래스에 여러 가지가 나오더군요.



위와 같이 메인 클래스 이름이 겹쳐서 나오는 경우는 숫자가 붙어 있지 않은 메인 클래스를 선택해 주시면 됩니다.



그럼 아래 이미지와 같이 Main class가 잘 선택 되었고 jar 파일도 잘 선택 하실 수 있습니다. 직접 찾지 않고 Main Class를 직접 타이핑을 하니 EXE 파일을 실행해도 반응이 없는 EXE 파일이 실행되더군요 그러니 실수를 줄이기 위해서는 먼저 JAR 파일을 선택하시고 Main class가 있는 자바 파일을 선택해 주시는 게 좋습니다.



마지막으로 4번째 메뉴를 선택해 주시고 Minimum JVM Version에 현재 PC에 설치된 JVM 버전을 넣어 주시면 됩니다.



현재 JVM 버전은 JAVA를 설치하신 폴더에서 확인하실 수 있습니다.



이제 EXE 파일을 만들기 위해서 상단에 Project 메뉴에서 Compile 메뉴를 눌러 주시면 됩니다.



그럼 아래 이미지와 같이 저장 폴더를 다시 물어보는데 파일 이름은 아무 이름이나 넣어 주셔도 되는데 반드시 확장자는. exe는 넣어 주시고 저장을 눌러 주셔야 합니다. 이건 좀 오류 같은데 해당 폴더에 저장하고 파일 이름을 지정해도 결국엔 Executable 메뉴에서 지정한 폴더와 EXE 파일명으로 파일이 생성됩니다. 


하지만 이 부분에서 EXE 파일을 지정 안 해 주시면 EXE 파일을 만들어도 실행이 되지 않고 만드신 EXE 파일이 반응이 없습니다. 



위 과정까지 완료가 되면 아래 이미지와 같이 작업이 완료되었다고 나옵니다.



그럼 아래 이미지와 같이 EXE 파일이 생성된 걸 확인 하실 수 있습니다.



EXE 파일을 실행해보니 제가 SWING으로 만든 프로그램이 잘 실행되네요.



추가로 JSmooth를 이용해 EXE 파일을 만들 때 아래 이미지와 같이 Java has not been foun on your computer. Do you want to download it? 이라는 경고 창이 나오시는 분은 시스템 변수에 JAVA_HOME 경로가 정상적으로 설정이 되어 있는지 확인해 보시기 바랍니다. 


JAVA_HOME 경로가 지정되어 있지 않은 경우 아래 이미지와 같이 오류가 나더군요. 자바 환경 변수 설정은 링크된 경로를 참고하시면 도움이 되실 겁니다. JDK 버전 10.0.1버전 기준입니다. - http://zzarungna.tistory.com/1254 



JAVA 프로그래밍을 하면서 이클립스 툴을 이용해 JAR 파일을 만들고 JSmooth을 이용해 EXE 실행 파일을 만드는 방법까지 간단히 작성해 보았습니다. 혹시라도 저와 같은 오류가 나거나 저와 비슷한 환경에서 JAR 파일을 만들고 EXE 파일을 만드시는 분 중 오류가 나거나 사용방법이 필요하신 분들은 참고하시면 좋을 것 같습니다.

저작자표시비영리변경금지
  • 해리포터
    2019.01.07 18:08

    실행은 잘 되는데 이미지가 짤려서 나오는데 어떻게 해야되나요??

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2019.01.08 15:24 신고

      JSmooth에서 실행한 프로그램 내에 이미지가 잘려서 나오나요?

      이미지 첨부를 하고 직접 테스트 해본게 아니라서 정확히 답변 드리기는 힘드네요.

      이미지 사이즈 자체를 줄이거나 프로그램 내에 이미지가 잘리지 않도록 넓이 높이를 조정해 보시는 게 어떨까요?

  • hello
    2020.05.19 11:16

    login.exe.jsmooth이렇게 나오는데 어떤게 잘못되었다요?

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2020.05.19 14:05 신고

      글쎄요 저도 정확히 어떤 원인 때문에 그런건지 잘모르지만 생성된 exe 파일의 뒷부분인 .jsmooth를 지우고 실행해봐도 진행이 안되나요?

      파일 이름을 지정하는 부분에서 잘못된 건지 다른 문제 때문에 그런지 저도 정확히 알수가 없내요.

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

이클립스 자바파일 JAR 파일을 만드는 방법

이클립스 자바파일 JAR 파일을 만드는 방법

이클립스를 사용하여 JAVA 파일을 JAR 파일로 내보내는 방법에 대해서 간단히 작성해 보려고 합니다. jar 파일을 만들어서 최종적으로 해당 파일을 exe 파일로 변환하는 방법까지 간단히 작성하려 합니다.


JAR 파일이 무엇인지 정보를 찾아보니 자바 클래스 파일을 하나로 묶어서 배포하기 위한 파일 포맷이라고 되어 있네요. 작성 기준 이클립스 버전은 Photon Release(4.8.0) 이며 이클립스 버전에 따라서 다를 수 있으니 참고하시기 바랍니다.


제가 참고 하기도 하려고 정리한 것도 있지만 필요한 분들이 있을 수도 있다는 생각으로 나름대로 상세히 정리하면서 작성하니 필요하신 분들은 참고하시면 좋을 것 같네요.


먼저 이클립스에서 창에서 JAR 파일로 내보내려는 프로젝트 폴더를 선택하시고 마우스 오른쪽 버튼을 누르시고 Export 메뉴를 눌러 주시면 됩니다.



그런 뒤에 Export 메뉴 중에서 Java 폴더에 Runable JAR file 메뉴를 선택하시면 됩니다. 간단히 빨간색 네모 칸에 jar라고 검색하시면 간단히 검색이 가능하니 참고하시면 좋을 것 같습니다. 선택이 완료되시면 Next 버튼을 눌러 주시면 됩니다.



Launch configration 메뉴 아래에 빈공간을 눌러 보시면 내보내고자 하시는 프로젝트 폴더에 프로그램 시작 지점인 main 자바 파일을 선택해 주시면 됩니다.


저와 같은 경우는 같은 이름으로 main 클래스 파일이 두 개가 있는데 같은 자바 파일을 계속 덮어 쒸우다 보니 메인 자바 파일 정보가 계속 겹쳐서 이런 현상이 생기더군요.


그래서 저는 같은 이름 중에서 숫자가 높은 메인 자바 파일을 선택하였습니다. main이 있는 클래스를 선택하시고 Next 버튼을 눌러 주시면 됩니다. 대부분 JAVA 파일이 겹쳐있지 않는다면 하나의 자바 파일 이름이 나오실 겁니다.


만약에 이렇게 겹쳐진게 보기 싫으시다면 이클립스를 종료 하시고 해당 이클립스 폴더에 있는 모든 폴더를 삭제하고 이클립스를 다시 실행하시고 프로젝트 파일을 다시 만들어서 파일을 옮기시는게 가장 깔끔 합니다.



예를 들어서 아래 이미지와 같이 해당 프로젝트의 시작 클래스인 public static void main 구문이 있는 자바 파일을 선택하시면 됩니다.



위와 같이 자바 파일을 선택하시면 아래 이미지와 같이 창이 뜹니다. 이제 추가로 JAR 파일을 내보낼 폴더를 선택하시면 됩니다. Browse 버튼을 눌러 주시면 됩니다.



저는 C드라이브에 JavaProject 폴더를 만들었습니다. 이 경로에 myProject.jar 파일이라는 이름으로 jar 파일을 저장하였습니다.



아래 이미지와 같이 Export destination 선택이 완료된 후에 Finish 버튼을 눌러 주시면 됩니다.



그럼 아래 이미지와 같이 Runnable JAR File Export 알림 창이 나오는 경우가 있는데 OK 버튼을 눌러 주시면 됩니다.



방금 JAR 파일을 내보낸 폴더를 들어가 보시면 아래 이미지와 같이 JAR 파일이 생성되어 있습니다. 이제 해당 JAR 파일을 실행해 보도록 하겠습니다. JAR 파일을 더블 클릭하면 실행이 되는데 운영 체제에 따라서 JAR 파일이 실행이 안 되는 분들도 있으실 겁니다. 


이러한 경우는 다른 방법으로 JAR 파일을 실행하실 수 있습니다. 아래 이미지와 같이 JAR 파일이 있는 폴더를 복사해 놓도록 합시다.



해당 JAR 파일을 실행하는 방법이 몇 가지 있는데 가장 먼저 도스 모드에서 실행해 보도록 하겠습니다. 윈도우+R 키를 누르시고 CMD를 누르시고 확인 버튼을 눌러 주시면 됩니다.



아래 이미지와 같이 DOS 모드에서 JAR 파일이 있는 경로로 이동해 주시면 됩니다. CD (JAR 파일이 있는 폴더명) 해주시면 됩니다. 방금 복사한 경로를 CMD 창에서 붙여넣으시려면 마우스 오른쪽 버튼을 눌러 주시면 텍스트가 붙여지니 참고 하시기 바랍니다.



dir 명령어로 확인해 보니 제가 방금 내보낸 JAR 파일이 있네요. JAR 파일이 있는지 확인을 하시고 DOS 창에서 java -jar 지정한 JAR 파일이름.JAR 엔터를 눌러 주시면 됩니다. 저와 같은 경우는 myProject.jar 파일로 JAR 파일을 만들어서 java -jar myProject.jar 입니다.




CMD 창에서 실행해 보니 아래 이미지와 같이 제가 만든 프로젝트 자바 프로그램이 잘 실행이 되네요.



내보낸 JAR 파일을 매번 DOS 모드에서 실행하기 불편하니 다른 방법을 사용해도 JAR 파일을 실행하실 수 있습니다. 아래 이미지와 같이 생성한 JAR 파일 폴더로 다시 들어가 주시고 마우스 오른쪽 버튼을 누르시고 새로 만들기 텍스트 문서를 선택해 주시면 됩니다.



생성한 txt 파일의 확장자를 .bat 파일로 변경해 주시면 됩니다. 확장자는 반드시 .bat로 해주셔야 합니다. 확장자가 보이지 않으시는 분들은 윈도우 환경에서 확장자 변경하는 방법에 글을 참고하시기 바랍니다. - http://zzarungna.tistory.com/487



방금 만든 start.bat 파일을 선택하고 마우스 오른쪽 버튼을 누르시고 편집 버튼을 눌러 주시면 됩니다.



DOS 모드에서 실행한 명령어와 같은 java -jar 지정한 jar 파일 이름 넣어 주시고 저장해 주시면 됩니다. 저와 같은 경우는 java -jar myProject.jar를 입력하고 저장 하였습니다.



위 과정을 거치면 start.bat 파일만 더블클릭해 주시면 자바 파일이 실행 됩니다.



그럼 DOS 모드에서 실행된 결과와 동일하게 제가 만든 JAVA 프로젝트가 잘 실행이 되는 것을 확인하실 수 있습니다.



이클립스를 사용하여 JAR 파일을 내보내는 방법과 내보낸 JAR 파일을 실행하는 방법에 대해서 간단히 작성하였습니다. 필요한 분들이 있다면 참고하시기 바랍니다~ :) 


추가로 생성한 JAR 파일을 EXE 실행 파일로 변환하는 방법에 대해서도 간단히 작성하였으니 필요하신 분들은 아래 링크된 URL도 참고하시면 좋을 것 같습니다.

이클립스 자바파일 JAR 파일을 JSmooth를 이용하여 EXE 파일로 변경하는 방법 - http://zzarungna.tistory.com/1273

저작자표시비영리변경금지
  • 김민기
    2020.08.24 17:37

    안녕하세요
    JAR 파일을 exe파일로 만드는 법에 대한 게시글 정말 잘 읽었습니다. 막막했는데 이 글을 보고 궁금한 점이 많이 풀렸어요 감사합니다.
    괜찮으시다면 질문하나 드려도 될까요?
    제가 Leap motion을 이용해 마우스동작을하는 java프로그램을 만들었습니다. 이걸 exe파일로 만들어 마우스를 대체하여 윈도우에서 동작하게 하고싶은데 문제는 프로그램이 백그라운드에 있더라도 동작을 해야 한다는점입니다. 검색을 해보았지만 java로는 불가능 하다 라는 답변밖에 없어서 이렇게 글을 남깁니다.
    혹시 java로 만든 exe 파일도 백그라운드에서 실행가능한 방법을 알고 계신가요?

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2020.08.25 02:41 신고

      우선 좋은 댓글 남겨 주셔서 정말 감사합니다.

      좀더 깊은 지식과 아이디어가 필요할 듯 합니다. 저도 정확히 어떻게 해야할지 감이 오지를 않네요.

      JAVA언어를 이용해 현재 실행중인 프로세스를 체크해 실행중인 화면을 찾아 직접 열어 실행 시키는 방식밖엔 떠오르지 않네요. 이것도 가능할지는 정보를 찾아봐야 할듯 합니다.... :)

트랙백

※ 스팸 트랙백 차단중 ...{ ? }

이클립스 메소드 설명이 나오지 않을때(Note: This element neither has attached source nor attached Javadoc and hence no Javadoc could be found)

이클립스 메소드 설명이 나오지 않을때(Note: This element neither has attached source nor attached Javadoc and hence no Javadoc could be found)

이클립스 도구를 이용하여 JAVA 프로그래밍 코딩을 하면서 이미 정의된 메소드를 사용하는 일이 많습니다. 이런 다양한 메소드 들을 모두 외우고 매번 찾아보기에는 번거롭기도 하고 자주 사용하지 않는 메소드의 사용방법이나 구조를 파악하기 어려운 경우가 많은 것 같습니다.


이클립스 툴에서는 메소드의 리턴 값, 상속구조, 익셉션, 메소드의 상세 정보를 이클립스 노트에서 확인할 수 있습니다. 이런 노트를 확인하기 위해서는 해당 메소드에 마우스 포인터를 이동해 보면 메소드의 상세정보를 쉽게 확인하실 수 있습니다.


그런데 아래 이미지와 같이 메소드의 상세 정보가 나오지 않고 Note: This element neither has attached source nor attached Javadoc and hence no Javadoc could be found. 나오고 메소드의 상세 정보를 확인할 수 없는 경우가 있습니다.



이런 경우는 대부분 이클립스 프로그램 설치 이후에 JAVA jdk 경로 설정이 JDK가 아닌 JRE로 설정이 되어 있는 경우 이러한 현상이 나타나고 각종 메소드의 정보들이 JDK에 존재하기 때문에 위처럼 노트에 상세 정보가 나오지 않으시는 분들은 JAVA 인스톨 경로를 JDK 경로로 지정해 주시면 됩니다.


자바 경로가 정상적으로 지정 해도 이러한 경우가 생길 수 있습니다. 메소드의 상세 정보를 노트에서 확인하기 위해서 이클립스 > Window > Preferences 메뉴를 눌러 주시면 됩니다.



그런 뒤에 Java 메뉴에서 Installed JREs 메뉴를 눌러 주시고 빨간색 화살표 방향에 표시된 부분을 선택후 Edit를 누르시거나 더블클릭 해주시면 됩니다.



전이미 변경해서 경로가 JDK라고 나오는데 JRE home 메뉴에서 Directory 메뉴를 눌러 주시면 됩니다.



이곳에서 Java 폴더에 있는 jdk 폴더를 선택하고 폴더 선택을 눌러 주시면 됩니다. jdk 버전이 여러 개 있으신 분들은 가장 최신 버전의 JDK 폴더를 선택해 주시면 되겠네요.



위처럼 JDK 폴더 경로를 지정 하시고 Finish 버튼을 눌러 주시면 됩니다.



그런 뒤에 Apply and Close 버튼을 눌러 주시면 됩니다.



위와 같이 JRE로 지정된 부분을 JDK로 설정을 해주시면 아래 이미지와 같이 자바 메소드의 상세 정보를 확인 하실 수 있습니다.



이클립스를 이용해 자바 프로그래밍을 하시는 분 중에서 이클립스 노트의 상세 정보가 나오지 않으시는 분들은 참고하시기 바랍니다~

저작자표시비영리변경금지
  • 지나가는사람
    2020.11.03 16:56

    완전감사합니당~~!1

    • Favicon of https://zzarungna.com BlogIcon zzarungna
      2020.11.07 06:14 신고

      도움이 된것 같아 다행입니다~~ :)

트랙백

※ 스팸 트랙백 차단중 ...{ ? }
이전페이지 다음페이지
방명록 : 관리자 : 글쓰기
zzarungna's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라

HOME

프로그래밍 코드를 좋아하고 생활속에 필요한

유용한 IT 정보를 작성 하려고 노력 하고 있습니다.

  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • 소스 (1521)
    • 프로그래밍 (409)
      • HTML (22)
      • CSS (30)
      • XML (14)
      • Javascript (27)
      • Jquery (13)
      • Ajax (10)
      • ASP (12)
      • PHP (23)
      • Java (36)
      • JSP (8)
      • 안드로이드 (9)
      • C# (52)
      • Winform (32)
      • WPF (13)
      • ADO.NET (8)
      • ASP.NET(4.0) (24)
      • LINQ (2)
      • ORACLE (9)
      • MS - SQL (24)
      • SERVER (10)
      • Programming Exam (6)
      • MySQL (3)
      • EditPlus (6)
      • 재미삼아만든 프로그램 (3)
    • IT 정보 (385)
    • 스마트폰 정보 (216)
      • 안드로이드 (117)
      • 아이폰 (72)
      • 애플리케이션 (21)
    • 게임 (106)
      • PC (50)
      • PS4 (36)
      • 핸드폰 (17)
    • 윈도우 (60)
    • Sony PlayStation (54)
      • PS4 (35)
      • PS5 (10)
      • PS VITA (3)
      • PlayStation Network (6)
    • SNS (61)
      • 카카오톡 (39)
    • 금융 (50)
    • 개인방송 (33)
    • 유튜브 (35)
    • 만화 (19)
    • 스포츠 (12)
    • IT 용어 (5)
    • 다운로드 (3)
    • 노래 (12)
    • 엑셀 (5)
    • 일상 (50)

카테고리

PC화면 보기