SyntaxHighlighter.all(); 게을러지고 싶어 부지런한 개발자 :: 게을러지고 싶어 부지런한 개발자

안녕하세요! 포트폴리오용으로 스프링 프로젝트를 하나 저는 만들었구요. 그걸 서버에 배포하기 위해 AWS를 통해 올리는 방법을 이제부터 단계별로 보여드리도록 할게요. 

추후 저 역시 또다시 서버에 배포할 시 헤매지 않도록 기억하기 위해 단계별로 스크린 샷을 통해 그 과정을 공개하겠습니다. 

우선 aws.amazon.com.ko에 들어가셔서 계정을 하나 만들어주세요! 계정만드는 과정은 생략 할게요.

 

계정을 다 만드셨으면 이제부터 서버에 올리기위한 과정을 하나씩 보여드리겠습니다!

(이번 포스트에서 작성할 내용은 ....

    - EC2에 가상의 컴퓨터(서버)를 만들기  (즉 인스턴스 생성)

    - IP(고정)를 생성하여 1번에서 만든 컴퓨터(서버)와 연결   ) 

========================================================

EC2에 가상의 컴퓨터(서버) 만들기 (즉, 인스턴스 생성) 

0. 서비스 클릭 -> EC2 클릭 

 

1. 계정 만든 분은 아래처럼 실행중인 인스턴스가 없다고 나와요.

인스턴스를 만든다는 것은 즉, 아마존에 가상의 컴퓨터(서버)를 만든다는 의미로 보시면 돼요! 

인스턴스 시작 버튼 클릭해주세요! 

 

2. 상단 네비바를 보면 1.AMI선택부터 7.검토까지 있는데 인스턴스(가상의 서버)를 만들기 위한 단계입니다.

무료를 써야 하니 Ubuntu Servcer를 선택! 

 

3. 무료유형 딱 한 개 있구요. 이미 디폴트로 선택되어있어요. 그냥 다음 클릭해주세요

 

4. 아마존에서 제공한느 기본설정 그대로 두고 '다음:인스턴스세부정보구성' 클릭! 

 

5. 서버의 하드웨어 용량을 얼마만큼 할건지 설정해주는 부분이구요. 디폴트로 8이 설정되어있었지만, 프리티어 사용가능 고객은 아래에서 나와있듯이 30까지 되어있어요. 따라서 크기를 30 으로 해줍시다! 무료니까 넉넉하게 쓰면되겠죠

6. 다음 클릭

7. 규칙추가를 눌러서 아래 세개를 추가해줍시다. 전 mysql 사용하므로, 마지막 유형에는 MYSQL이 들어가있어요.

(소스속성에 0.0.0.0/0 이라고 되어있는 건 어느 곳에서나 접속가능하다는 뜻입니다!) 

8. 단계7에는 아래와 같이 포트는 이러이렇게 설정된다~~라고 알려줍니다. 바로 시작하기 버튼 클릭! 

9. 새 키 페어생성을 해주어야 해요. 두 번째 칸에 키 페어 이름을 임의로 써 주시구요.

키 페어 다운로드를 클릭해주면 하단에 awsDevproject.pem이라는 키가 다운로드 됩니다. 

(이 키는 가상의 컴퓨터(서버)로 들어가기 위한 키이므로 아주아주 중요해요!)

 

10. 중요한 키를 잃어버리면 안되겠죠.. 그래서 저는 C: 드라이브 밑에 키 페어 이름과 동일한 폴더를 하나 만들었고, 그 안에 다운받은 키페어를 넣어주었습니다. 

 

11. 폴터에다가 키를 잘 넣어주셨다면 이제 인스턴스 시작 버튼을 클릭해주세요 

 

12. 이제 EC2에 인스턴스를 하나 생성했습니다 ^_^ 

 

13. 왼쪽 사이드바에서 인스턴스 클릭하면 방금전 만든 가상컴퓨터인 인스턴스가 보일 거예요!! 방금 만들어서 상태검사에는 초기화...라고 나오지만 1~2분 뒤면 2/2개 검사 라고 바뀝니다~~ 인스턴스 생성 완료!! 

 

IP(고정) 생성, 방금 전 만든 서버에 연결 

 

14. 왼쪽 사이드바에 탄력적 IP를 찾아 클릭한 뒤, 탄력적 IP주소 할당 클릭 

 

15. 할당 클릭 

 

16. 할당 버튼을 클릭하고 나면 아래처럼 IP주소가 할당된 것을 보실 수 있습니다!  하지만 연결된 인스턴스 쪽에 아무것도 없는데, 아직 이 ip에 연결된 인스턴스가 없다는 의미예요. 

둘을 연결시켜주기 위해 작업버튼 클릭 >  탄력적 IP주소 연결 을 눌러줍니다.

(릴리스 버튼은 해제/삭제한다는 의미래요) 

 

17. 인스턴스 선택을 누르시면, 제가 아까 만든 인스턴스가 하나 보입니다. 이걸 선택해주고 연결 클릭! 

 

18. 아까는 연결된 인스턴스가 없었는데, 이제는 인스턴스가 하나 연결된게 보이네요

 

 

19. 마지막으로 왼쪽 사이드바에 EC2대시보드를 클릭 하면 실행중인 인스턴스가 이제 1개 나오고,

키 페어와 IP로 1개씩 생긴 것을 확인할 수 있습니다 .

 

 

 


여기까지 EC2 인스턴스 생성과 IP를 생성했구요 

 

2탄에서 또 뵙겠습니다~~ 

 

 

 

 

1. System 클래스의 arraycopy() 메소드 (배열의 길이를 마음대로 늘일 수 O)

2. Arrays 클래스의 copyOf() 메소드 (배열의 길이를 마음대로 늘일 수 O)

3. Object 클래스의 clone() 메소드(전 배열과 같은 길이의 배열밖에 만들 수 없음)

4. for 문과 인덱스를 이용한 복사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 
public class Main {
    public static void main(String[] args) {
        int[] arr1 = new int[]{12345};
        int newLen = 10;
        
        // 1. System 클래스의 arraycopy() 메소드
        int[] arr2 = new int[newLen];
        System.arraycopy(arr1, 0, arr2, 0, arr1.length);
        
        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i] + " ");        // 1 2 3 4 5 0 0 0 0 0 
        }
        System.out.println();
        
        // 2. Arrays 클래스의 copyOf() 메소드
        int[] arr3 = Arrays.copyOf(arr1, 10);
        
        for (int i = 0; i < arr3.length; i++) {
            System.out.print(arr3[i] + " ");       // 1 2 3 4 5 0 0 0 0 0 
        }
        System.out.println();
        
        // 3. Object 클래스의 clone() 메소드
        int[] arr4 = (int[])arr1.clone();
        
        for (int i = 0; i < arr4.length; i++) {
            System.out.print(arr4[i] + " ");        // 1 2 3 4 5 
        }
        System.out.println();
        
        // 4. for 문과 인덱스를 이용한 복사
        int[] arr5 = new int[newLen];
        
        for (int i = 0; i < arr1.length; i++) {
            arr5[i] = arr1[i];
        }
        
        for (int i = 0; i < arr5.length; i++) {
            System.out.print(arr5[i] + " ");   // 1 2 3 4 5 0 0 0 0 0 
        }
    }
}
 
cs

continue문

루프 내에서 해당 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식의 판단으로 넘어가게 해줌

 

다음 예제는 1부터 100까지의 정수 중에서 5의 배수와 7의 배수를 모두 출력하는 예제입니다.

 

public class prog {
	public static void main(String[] args) {
		for (int i = 1; i <= 100; i++) {
			if (i % 5 == 0 || i % 7 == 0) {
				System.out.println(i);
			} else {
				continue;
			}
		}
	}
}

출력결과

5
7
10
....
84
85
90
91
95
98
100

 

break 문

break 문은 루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤, 반복문 바로 다음에 위치한 명령문을 실행합니다.

즉 루프 내에서 조건식의 판단 결과와 상관없이 반복문을 완전히 빠져나가고 싶을 때 사용합니다.

 

다음 예제는 1부터 100까지의 합을 무한 루프를 통해 구하는 예제입니다.

int num = 1, sum = 0;

 

while (true) { // 무한 루프

    sum += num;

    if (num == 100) {

        break;

    }

    num++;

}

System.out.println(sum);

출력결과   5050

 

여기서 유의할 점!!! 

 

일반적인 break 문은 단 하나의 반복문만을 빠져나가게 해줍니다.

따라서 여러 반복문이 중첩된 상황에서 한 번에 모든 반복문을 빠져나가거나, 특정 반복문까지만 빠져나가고 싶을 때는 다른 방법을 사용해야 합니다.

 

이때 사용할 수 있는 방법이 바로 반복문에 이름(label)을 설정하는 것입니다.

가장 바깥쪽 반복문이나 빠져나가고 싶은 특정 반복문에 이름을 설정한 후, break 키워드 다음에 해당 이름을 명시하면 됩니다.

그러면 해당 break 키워드는 현재 반복문이 아닌 해당 이름의 반복문 바로 다음으로 프로그램의 실행을 옮겨줍니다.

 

이에대한 예제는 구구단 2단부터 4단까지 출력하는 코드입니다.

allLoop :

for (int i = 2; i < 10; i++) {  // 1번째 반복문

    for (int j = 2; j < 10; j++) { // 2번째 반복문

        if (i == 5) {

            break allLoop;

        }

        System.out.println(i + " * " + j + " = " + (i * j));

    }

}

출력결과

2 * 2 = 4

2 * 3 = 6

2 * 4 = 8

2 * 5 = 10

...

4 * 6 = 24

4 * 7 = 28

4 * 8 = 32

4 * 9 = 36

 

 

 

 

 

 

어느날 잘 돌아가던 프로젝트에서 아래와 같은 에러가 떴다.

 

심각: Servlet.service() for servlet [appServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: No suitable driver found for jdbc:log4jdbc:mariadb://localhost:8080...

 

메시지 문구를 보면 log4jdbc를 인식하지 못한다고 의미.

 

문제의 원인은 org.mariadb.jdbc.Driver 대신에 log4jdbc.driver를 쓸 수 있도록 하는 속성이 빠졌기 때문!
log4jdbc.log4j2.properties 파일에 들어가서 아래 내용 중 빠진 것이 있다면 넣어주고 다시 실행해보자!

 

<!-- log4jdbc.log4j2.properties --> 
log4jdbc.drivers=org.mariadb.jdbc.Driver
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

 

 

갑자기 이클립스 pom.xml에 빨간 에러가 잡혀 확인해보니 아래와 같은 에러가 발생했다. 

Execution default-resources of goal org.apache.maven.plugins:maven-resources-plugin:2.6:resources failed: Unable to load the mojo 'resources' (or one of its required components) from the plugin 'org.apache.maven.plugins:maven-resources-plugin:2.6' (org.apache.maven.plugins:maven-resources-plugin:2.6:resources:default-resources:process-resources)

org.apache.maven.plugin.PluginExecutionException: Execution default-resources of goal org.apache.maven.plugins:maven-resources-plugin:2.6:resources failed: Unable to load the mojo 'resources' (or one of its required components) from the plugin 'org.apache.maven.plugins:maven-resources-plugin:2.6'
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:156)
	at org.eclipse.m2e.core.internal.embedder.MavenImpl.execute(MavenImpl.java:331)
	at org.eclipse.m2e.core.internal.embedder.MavenImpl.lambda$7(MavenImpl.java:1342)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:177)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:112)
	at org.eclipse.m2e.core.internal.embedder.MavenImpl.execute(MavenImpl.java:1341)
	at org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant.build(MojoExecutionBuildParticipant.java:52)
	at org.eclipse.m2e.core.internal.builder.MavenBuilderImpl.build(MavenBuilderImpl.java:137)
	at org.eclipse.m2e.core.internal.builder.MavenBuilder$1.method(MavenBuilder.java:173)
	at org.eclipse.m2e.core.internal.builder.MavenBuilder$1.method(MavenBuilder.java:1)
	at org.eclipse.m2e.core.internal.builder.MavenBuilder$BuildMethod$1$1.call(MavenBuilder.java:116)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:177)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:112)
	at org.eclipse.m2e.core.internal.builder.MavenBuilder$BuildMethod$1.call(MavenBuilder.java:106)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.executeBare(MavenExecutionContext.java:177)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:151)
	at org.eclipse.m2e.core.internal.embedder.MavenExecutionContext.execute(MavenExecutionContext.java:99)
	at org.eclipse.m2e.core.internal.builder.MavenBuilder$BuildMethod.execute(MavenBuilder.java:87)
	at org.eclipse.m2e.core.internal.builder.MavenBuilder.build(MavenBuilder.java:201)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:833)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:220)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:263)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:316)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:319)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:371)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:392)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:154)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:244)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: org.apache.maven.plugin.PluginContainerException: Unable to load the mojo 'resources' (or one of its required components) from the plugin 'org.apache.maven.plugins:maven-resources-plugin:2.6'
	at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo(DefaultMavenPluginManager.java:553)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:124)
	... 30 more
Caused by: org.codehaus.plexus.component.repository.exception.ComponentLookupException: java.util.NoSuchElementException
      role: org.apache.maven.plugin.Mojo
  roleHint: org.apache.maven.plugins:maven-resources-plugin:2.6:resources
	at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:267)
	at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:255)
	at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getConfiguredMojo(DefaultMavenPluginManager.java:519)
	... 31 more
Caused by: java.util.NoSuchElementException
	at org.eclipse.sisu.plexus.RealmFilteredBeans$FilteredItr.next(RealmFilteredBeans.java:118)
	at org.eclipse.sisu.plexus.RealmFilteredBeans$FilteredItr.next(RealmFilteredBeans.java:1)
	at org.eclipse.sisu.plexus.DefaultPlexusBeans$Itr.next(DefaultPlexusBeans.java:76)
	at org.eclipse.sisu.plexus.DefaultPlexusBeans$Itr.next(DefaultPlexusBeans.java:1)
	at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:263)
	... 33 more
	pom.xml	/lovepet	line 8	Maven Build Problem

 

 

이클립스 Maven 연동 시 plug in 에러 날 경우에 생긴 에러다. 

해결방법은 pom.xml에 아래의 디펜던시를 추가하자. 

<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.4.3</version>
</dependency>

이렇게 작성해준 뒤에,

1. 프로젝트 우클릭 > Run As > Maven Install

2. 이클립스 프로젝트 탐색기에서 해당 프로젝트 클릭 후 F5(새로고침)

3. 프로젝트 우클릭 > Maven > Update Project

 

끝!

 

 

 

웹개발 프로젝트를 만들다보니 JSON으로 날짜 받을 때 아래처럼 이상한 숫자로 받아지는 경우가 있다.

 

 

 

제대로 날짜 형식으로 받기 위해서는 VO에서 속성 위에 딱 한 줄만 추가하면 된다!!

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")

 

 

 

 

다시 확인 해보면 날짜 제대로 나오는 것을 확인!

'JSON | AJAX | 그 외 기술' 카테고리의 다른 글

JSON.stringify(), JSON.parse(), toJSON() 비교  (0) 2020.08.28

HTTP상태코드 : 클라이언트가 요청을 할 경우 서버는 요청에 대한 상세 결과를 알려 주는데 그것이 상태코드.  상태코드는 3자리 숫자로 구성되어 있으며, 뒤에 응답 문구가 붙는다. 

 

[HTTP 응답코드 종류 ]

# 100 번대 상태코드:  정보관련
  데이터의 일부를 서버가 받은 상태(처리중인 상태)
  
 # 200 번대 상태코드:  성공관련
200 -----> OK (에러없이 정상처리)
204 -----> 정상처리 되었으나, 서버에 보낼 데이터가 없음

# 300 번대 상태코드: 다른 URL 처리
301 -----> 요청한 URL이 새로 변경되었음 302
302 -----> Found (다른 페이지로 이동)
304 -----> Not Modified(기존의 데이터와 변경된 것이 없음)  


# 400 번대 상태코드: 클라이언트 관련 에러 
400 -----> Bad Request (클라이언트 요청에 문제가 있기떄문에 서버에서 인식할 수 없음 )
403 -----> Forbidden (서버에서 허락되지 않음. 접근 권한 없음) 
404 -----> Not Found(요청 URL을 찾을 수 없음) 
406 -----> 전송 방식이 허락되지 않음(REST방식에서 자주 나타나는 상태코드)

# 500 번대 상태코드: 서버 관련 에러
500 -----> Internal Server Error (서버에서 처리시 문제가 발생(프로그램 내부적인 오류) )
502 -----> 게이트웨이, 프록시 상태의 문제(과부하)
503 -----> 일시적인 서비스 중단 상태
504 -----> 지정된 처리시간이 지나서 처리되지 못하는 경우 

 

[ HTTP Method 종류 ]

GET

POST

PUT

DELETE

PATCH

HEAD

CONNECT

OPTIONS
TRACE

Custom

 

 

 

방법1)

 char - '0'을 이용하면 아스키코드값을 알 필요없이 int형으로 변환 가능
 

방법2)

 Character.getNumericValue(input.charAt(i)) 방법을 이용해도 형변환이 가능

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
// 1234567을 입력받으면 결과는 1+2+3+4+5+6+7=28출력
public class Main   {
    public static void main(String[] args) throws Exception {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String input = br.readLine();
        
        int sum = 0
        
        for (int i = 0; i < input.length(); i++) {
            // sum += input.charAt(i) - '0';  // 방법 1
            sum += Character.getNumericValue(input.charAt(i));  //방법 2
        }
        
        System.out.println(sum);
    }
}

+ Recent posts