본문 바로가기

JAVA

Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 - 4주차

Spring 시작하기

Chapter 1. Spring Framework을 배울 준비하기

 

AWS에 서버 구축하기

AWS 인스턴스 : 가상 컴퓨터, 새로 만든 것

Microsoft Remote Desktop : AWS에 우리가 만든 가상 컴퓨터

 

STS

STS - File - New - New Spring Legacy Project(3번째)

프로젝트 이름 쓰고 템플릿에 Spring MVC Project 체크

패키지명은 보통 도메인 네임 거꾸로 쓴 것

 

톰캣 연결시

cd /usr/local/Cellar/tomcat/10.0.23/bin 입력

./catalina start : 시작

./catalina stop : 종료

 

 cd ~/apache-tomcat-9.0.50/bin   <--- tomcat이 설치된 경로의 bin디렉토리로 이동
     ./startup.sh  <--- tomcat실행  
      ./shutdown.sh <--- tomcat종료 

 

 

톰캣 포트번호 충동 오류 뜰 때

sudo lsof -i:8080

그 다음, 점유 중인 프로세스의 PID 숫자 나온거

kill -9 41422

후 Server에 있는 바로 톰캣 다시 실행

 

원격 프로그램 실행 해보기

1. 로컬 프로그램 실행

public class Main {

	public static void main(String[] args) { // static이라 객체 생성 X
    	System.out.println("Hello");
    }
}

위 코드가 로컬 프로그램이라고 할 때,

로컬 프로그램 실행시 command line에서 실행하고

java Main 입력후 엔터

java : java.exe 자바 인터프리터로 이 Main클래스에 있는 main()메소드 호출 후 아래 문장들 실행

 

 

2. 원격 프로그램 실행

내 컴퓨터의 브라우저와 원격 프로그램엔 tomcat 같은 WAS가 필요

브라우저와 WAS가 있어야 원격 프로그램을 실행할 수 있다

 

브라우저에서 URL (ip 주소와 톰캣의 8080)입력후 엔터

외부에서 브라우저로 서버에 있는 프로그램을 실행하려면

  1. 프로그램을 외부에서 호출할 수 있도록 등록
  2. URL과 프로그램을 연결
package com.fastcampus.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller // 1. 프로그램 등록
public class Hello{
	
	@RequestMapping("/hello") // 2. URL과 main() 연결
	public void main() {
		System.out.println("Hello");
	}
}

http://111.222.333.444:8080/ch2/hello 를 브라우저 URL에 입력하면

hello와 연결된 메소드가 호출되고 이 URL과 연결된 문장 실행

ch2는 context root (project root)

 

위 코드 전체에서 static을 쓰지 않고도 잘 출력되는 이유

위 코드를 인스턴스 메소드라고 할 때 인스턴스 메소드는 객체 생성 후 반환 되는데

이 경우 중간에서 누군가(tomcat)이 객체를 생성해준 것

 

 

Chapter 2. Spring MVC

STS 에서 원격 프로젝트 만들기

<실행> 젤 위 프로젝트 우클릭 - Run As - 1 Run on Server(젤 위)

실행 후 새로 열린 창 localhost:8080/ch2/hello 치면 HTTP 상태 404- 찾을 수 없음이 뜨지만

실행이 잘되는 것 System.out이라 톰캣 콘솔에 출력이 잘된 것임

<원격 프로젝트 만들기>

클래스 등록 후

여기! 패키지명 우클릭 - New - _class

클래스 위에 1. 원격 호출 가능한 프로그램으로 등록 @Controller

메소드 위에 2. URL과 메소드를 연결 @RequestMapping("/hello")

각각 import 해주기

 

 

Reflection API를 사용하면 클래스 정보도 얻고 이걸 이용해 일반적으로 할 수 없는 일을 할 수 있다(private을 외부에서 호출)

local에 있는 tomcat 돌리기 (같은 컴퓨터 안의 브라우저와 톰캣을 띄워서 같은 컴퓨터 안에 있는 프로그램을 실행한 것)

STS에서

HomeController.java

package com.fastcamput.ch2;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller // 1. 원격 호출 가능한 프로그램으로 등록
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	/**
	 * Simply selects the home view to render by returning its name.
	 */
	
	// 2. URL과 메소드 연결 (맵핑, Mapping)
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home";
	}	
}

Hello.java

package com.fastcamput.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 1. 원격 호출 가능한 프로그램으로 등록
@Controller
public class Hello {
	
	int iv = 10; // 인스턴스 변수
	static int cv = 20; // static 변수
	
	// 2. URL과 메소드를 연결
	@RequestMapping("/hello")
	private void main() { // 인스턴스 메소드 - iv, cv를 둘 다 사용 가능
		System.out.println("Hello - private");
		System.out.println("cv");
		// private지만 잘 실행됨
	}

	public static void main2() { // static 메소드 - cv만 사용 가능
		System.out.println(cv); 
	}
}

Main.java

package com.fastcamput.ch2;

import java.lang.reflect.Method;

public class Main {

	public static void main(String[] args) throws Exception {
		
//		Hello hello = new Hello();
//		hello.main(); // private라서 외부 호출 불가
 
		// Reflection API를 사용 - 클래스 정보를 얻고 다룰 수 있는 강력한 기능
		// java.lang.reflect 패키지를 제공
		// Reflecton API를 이용해서 객체를 생성하고 메인메소드 호출해보기
		Class helloClass = Class.forName("com.fastcamput.ch2.Hello");
		// Hello 클래스의 Class 객체(클래스의 정보를 담고있는 객체)를 얻어오기
		
		Hello hello = (Hello)helloClass.newInstance(); //Class객체가 가진 정보로 객체 생성
		
		// Hello 클래스가 가지고 있는 메인메소드를 밖에서 호출할 수 있게 바꿔보기
		Method main = helloClass.getDeclaredMethod("main"); // Main메소드 정보를 가지고 온 것
		main.setAccessible(true); // private인 main()을 호출가능하게 한다.
		
		main.invoke(hello); // hello.main() 호출한 것과 동일
	}
}

결과

private void main(){ 에서

private를 써도 잘 실행됨

이유 : Reflection API를 사용하기 때문

Reflection API란 클래스 정보를 얻고 다룰 수 있는 강력한 기능을 제공하기 때문

java.lang.reflect 패키지를 제공

 

 

우리가 만든 프로그램을 AWS에 있는 서버에 올리고 우리 컴퓨터로 AWS(원격 컴퓨터)에 있는 프로그램 실행해보기

우리가 만든 프로그램 Export하기 

젤 위 프로젝트 우클릭 → Export - warrjator WAR file 누르고 Next → Destination에 이름 ch2.war 치고 오른쪽 Browse 클릭

Download에 만들기 + Overwrite existing file 체크

(Download 가서 만든 ch2.war 파일 복붙해서 확장자 zip으로 하면 확인 가능)

(war파일 : 자바 어플리케이션을 하나의 파일로 묶을 때 사용)

이제 AWS에 복사하면 됨

aws구글에 쳐서 접속 → 우측 상단 콘솔에 로그인 → 모든 서비스 → EC2

(평상시에 인스턴스 실행중인거 체크하고 작업 → 인스턴스 상태 → 중지 해두기(단, ip주소 바뀜))

(내가 얼만큼 사용한지 보려면 검색창에 Billing 치기 → 프리티어서비스)

→ 인스턴스 → 실행중인 인스턴스 누르고 [연결] 누르기 → RDP 클라이언트

→ 원격 데스크톱 파일 다운로드 → 다운로드 한 거에 칠 암호는 암호 가져오기로 (→ Key 검색해서 Key.pem 열기) → 원격데스크톱 열림

→아까 저장한 ch2.war 복사 → 원격데스크톱의 파일 → apache-tomcat 들어가기(Local Disk C안) → webapps 안에 붙여넣기

(톰캣 실행되면서 자동으로 압축풀림)

톰캣 실행해보기

Local Disk C안 원격 데스크톱 파일 → apache-tomcat → bin → startup

(귀찮으니까 startup 우클 → Create shortcut 해서 배경화면으로 빼기)

→ 더블클릭시 톰캣 실행 → wepapps 가면 압축 풀어서 ch2 파일이 생김

→ 원격 컴퓨터에 우리가 만든 프로그램이 설치가 된 것

local 컴퓨터에서 원격 AWS 서버에 접근해보기

AWS 서버 ip를 알아야한다 → AWS인스턴스 들어가서 IPv4 퍼블릭 ip 복사

→ 복사한 AWS ip:8080/ch2/hello 엔터

→ 우리 컴퓨터에는 찾을 수 없음 뜨지만 원격 컴퓨터 Tomcat 실행한 곳엔 정상 출력

(우리가 만든 프로그램을 원격 서버에 잘 설치했고 컴퓨터에서 원격 서버로 접속한 것)

 

 

 

 

4주차 후기

강의는 생각보다 짧았지만 처음에 설치할 때 어마무시하게 시간을 잡아먹었다

맥인데 AWS는 윈도우로 설치하는 것이 신기했다

따라가는게 급급해 기억에 남을진,,ㅎ 더 열시미 담주차 따라가봐야겠음

3주차까지한 자바 강의가 다소 부실한 느낌이라 선택사항 강의를 들어야겠다..