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)입력후 엔터
외부에서 브라우저로 서버에 있는 프로그램을 실행하려면
- 프로그램을 외부에서 호출할 수 있도록 등록
- 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주차까지한 자바 강의가 다소 부실한 느낌이라 선택사항 강의를 들어야겠다..
'JAVA' 카테고리의 다른 글
Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 - 6주차 (0) | 2022.09.13 |
---|---|
Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 - 5주차 (0) | 2022.09.06 |
Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 - 3주차 (0) | 2022.08.23 |
Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 - 2주차 (0) | 2022.08.14 |
Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 - 1주차 (0) | 2022.08.06 |