반응형

Read File  (File-> 변수)

  • fread(ptr, size, count, file);

  •  fread_s(ptr, buffer_size, element_size, element_count, file);

스트림에서 count 개의 원소를 가지는 배열을 읽어온다, 원소의 크기는

size 바이트 이고 ptr 가리키는 배열에 넣게됨,

보안에 취약해서 fread_s 권장, bufferz_size 추가됨

 

 

 

 

 

  •   fscanf(file, "%d", &iNum);

  •   fscanf_s(file, "%d", &iNum, sizeof(iNum))

스트림(file)에서 형식문자열로 데이터를 읽고 메모리 공간에 저장

 

 

 

 

 

  •   fgets(strBuffer, length, file);

스트림(file)에서 문자열을 (length -1) 개의 문자을 입력 받을 까지

또는 개행문자나 파일 (EOF) 도달할 까지 입력 받아서 strBuffer 출력(저장)

 

 

 

Write File (변수 -> File)

  • fprintf(file, "%d \n", i);

  • fprintf_s(file, "%d \n", i);

스트림(file) format specifier 사용하여 printf 처럼 파일에 출력함(파일에 저장)

text 파일을 저장할 때 쓰임

 printf : 화면에 출력, fprintf : 파일에 출력, sprintf : 변수(버퍼) 출력

 

 

 

 

 

  • fwrite(ptr, sizeof(i), count, file);

ptr 저장된 데이터를 sizeof(i) * count 만큼 읽어서 스트림(file) 출력함(저장)

바이너리 파일을 저장할 쓰임

 

 

 

 

 

 

  • fputs(strBuffer, file);

strBuffer 가리키는 문자열을 NULL (문자('\0') 도달할 까지 스트림(file) 출력(저장) 한다, NULL문자는 제외됨

반응형

'C' 카테고리의 다른 글

memset, memcpy, memmove  (0) 2020.03.13
expression(표현식)  (0) 2020.03.12
Local Variable, Global Variable, Static Variable  (0) 2020.02.28
fseek, ftell, 파일 크기 알아내기  (0) 2020.02.25
반응형

std::ios_base

  • stream input output 형식 관련 데이터를 처리함(정수형을 출력시 10진수로 할지 16진수로 할지 등을 처리
  • 모든 입출력 클래스는 ios_base base 클래스로 두고있음

 

 

 

std::ios

  • stream buffer 초기화
  • 입출력 작업의 상태를 처리(파일의 끝에 도달했는지를 있음, eof() 함수

 

std::istream, std::ostream

  • ios_base, ios 입출력 작업 상태, 데이터 처리를 했다면
  • istream, ostream 각각 실제로 입력 출력을 수행함
  • cin istream 클래스의 instance 이다, 연산자 >> 오버로딩이 되어있고 모든타입에 되어 있어서, 입력 가능
  • 그러나, cin(istream) 은 공백문자를 무시하고, \n 기준으로 입력을 그만받음
  •  
  • cout 또한 ostream 클래스의 instance 이며, 연산자 << 오버로딩이 되어있고
  • 모든타입에 되어 있어서, 모든타입이 출력 가능함
  • http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/

 

std::ifstream

  • istream 상속 받음
  • filebuf 객체를 내부 스트림 버퍼로 사용
  • 연결된 파일에 istream에서 상속받은 입력 함수들을 있음
  • input 가능한 filebuf 객체 (input filebuf stream)

 

std::ofstream

  • ostream 상속 받음
  • filebuf 객체를 내부 스트림 버퍼로 사용
  • 연결된 파일에 ostream에서 상속받은 출력 함수들을 있음
  • output 가능한 filebuf 객체 (output filebuf stream)

 

std::iostream

  • istream, ostream 상속 받음 (입력,출력 둘다 가능)

 

std::fstream

  • iostream 상속 받음(입력, 출력 둘다 가능)
  • filebuf 객체를 내부 스트림 버퍼로 사용
  • 연결된 파일에 iostream에서 상속받은 입력 출력 함수들을 있음
반응형

'C++' 카테고리의 다른 글

c++ Singleton Pattern 기본 구현 방법  (0) 2020.03.03
const  (0) 2020.02.29
Static Member Function(정적 멤버 함수)  (0) 2020.02.27
CopyConstructor, Shallow Copy, Deep Copy  (0) 2020.02.24
std::function (c++ 11)  (0) 2020.02.23
반응형

Binary Search Tree(이진 탐색 트리)

  • 이진 트리는 하나의 노드가 두개의 포인터를 가지고 있다

  • 그중에서 이진 탐색 트리(binary search tree) 이진 탐색과 연결 리스트를 결합한 자료구조라고 있다

  • 노드의 왼쪽 서브트리에는 해당 노드의 값보다 작은 값을 지닌 노드들로 이루어져 있다

  • 노드의 오른쪽 서브트리에는 해당 노드의 값보다 값을 지닌 노드들로 이루어져 있다

  • 중복된 노드가 없어야 한다

  • 왼쪽 서브트리, 오른쪽 서브트리 또한 이진 탐색 트리이다

 

순회

트리의 모든 노드를 한 번씩 방문하여 모든 정보에 대한 선형 순서를 만들어내는 방법

 

 

전위순회(PreOrder Traversal) : Root 가장 먼저 들린다

  1. Root 방문

  2. 왼쪽 Subtree 방문

  3. 오른쪽 Subtree 방문

 

 

중위순회(InOrder Traversal) : Root 중간에 들린다

  1. 왼쪽 Subtree 방문

  2. Root 방문

  3. 오른쪽 Subtree 방문

 

후위순회(PostOrder Traversal) : Root 가장 나중에 들린다

  1. 왼쪽 Subtree 방문

  2. 오른쪽 Subtree 방문

  3. Root 방문

 

트리 노드 삭제 루틴

트리 노드를 삭제할시, 3가지 경우로 나뉜다

  1. 하위 노드가 없는경우

    • 그냥 삭제 한다
       
  2. 하위 노드가 하나만 있는경우(left 또는 right)

    • 하위 노드를 삭제된 노드 자리에 앉힌다
       
    •  

  3. 하위 노드가 둘다 있는 경우

    • 해당 노드가 head 루트 노드 보다 작으면 right node 삭제된 노드 자리에 앉힌다
      • (해당 노드가 head 루트 노드 보다 크면 left node 삭제된 노드 자리에 앉힌다)
    • 나머지 노드 left node 새로 앉힌 노드의 left node 맞춘다
      • (나머지 노드가 right 노드 였던 경우 새로 앉힌 노드의 right node 맞춘다)

 

 

 

 

 

순회 순서

 

 

위와 같은 이진탐색 트리가 존재할때

중위순회를 할경우

 

4,5,6,7,10,11,13,17,20 순으로 순회 한다 그림으로 그리면

 

위와 같은 경로가 그려진다

모든 노드는 left, right, root 노드를 가지고 있으며, 각각 노드들이 또다른 어떤 노드의 루트 노드가 있다, , 순회할수 있는 방향은 left, right, root 등으로 나뉘어지는게 어떤조건에서 어떤 경로로 이동하는 것일까?

 

일단 첫시작점을 이미 찾았다는 전제 하에서

가고자 하는 방향이 nullptr 경우 무시하기로 한다

또한 순회하면서 나오는 값들은 이전값보다는 높아야한다

4 -> rightNode -> leftNode

5 -> rootNode

6 -> rightNode/ -> leftNode(nullptr)

7 -> rootNode -> rootNode-> rootNode (7 보다 높지않은 값들(6,4) 거쳐서 10 도달

10 -> rightNode->leftNode

11 -> rootNode

13 ->rightNode -> leftNode

17 -> rootNode

20 ->/rightNode(nullptr)

 

위패턴으로 이터레이터 연산자 오버로딩 operator ++ () 구현할 경우

 

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
void operator ++ ()
{
    assert(m_pNode != nullptr);
 
    if (m_pNode->m_pRightNode != nullptr)
    {
        m_pNode = m_pNode->m_pRightNode;
        while (m_pNode->m_pLeftNode != nullptr)
        {
            m_pNode = m_pNode->m_pLeftNode;
        }
        return;
    }
    else if (m_pNode->m_iData < m_pNode->m_pRootNode->m_iData)
    {
        m_pNode = m_pNode->m_pRootNode;
        return;
    }
 
    while (m_pNode->m_iData > m_pNode->m_pRootNode->m_iData)
    {
        m_pNode = m_pNode->m_pRootNode;
    }
    m_pNode = m_pNode->m_pRootNode;
}
cs

위와 같은 코드가 된다

 

 

그럼 반대 루틴을 보면

20 -> leftNode

17 -> rootNode -> rootNode

13 -> leftNode

11 -> rootNode -> rootNode

10 -> leftNode -> rightNode -> rightNode //m_pHead

7 -> rootNode

6 -> leftNode

5 -> rootNode -> rootNode

4

 

일단 시작은 leftNode 간뒤 rightNode 찾는다, 그리고 rightNode 나오면 나올수록 계속 rightNode 간다

그리고 rootNode->rootNode 되는 부분은 왼쪽으로 뻗은길을 찾기위한 반복되는 과정이라고 할수있다

해당 노드의 데이터가 노드의 루트 데이터 보다 큰경우를 찾는것이다

오른쪽으로 뻗은길이 나올때까지 이동한다

(pNode->iData > pNode->pRoot->iData)

 

 

 

또다른 트리를 통해 다시 한번 자세히 살펴보면 

 

 

4,10,11,13,26,27,28,29,30,31 를 노드로 가지고 있는 트리다 이걸 제일 큰값 31에서 제일 작은값 4까지

순회하는 로직을 그려보면 붉은 화살표와 같다

 

순회 동작 과정

 

31

처음 31에서 시작할때는 바로 root 데이터가 30이므로 (왼쪽으로 뻗은길)

30으로 한칸 이동하면 끝난다

 

30

30에서는 왼쪽으로 뻗은길이 있기떄문에 바로 13으로 갈수 있지만

30 leftNode 자식이 있으므로(30보다 작고 13보다 큰수)

leftNode 가야 한다

그렇게 해서 29 이동한후 rightNode 있는지(29 30사이의 ) 파악하고 없으면 대기 한다

 

29

29에서도 마찬가지로 leftNode(27) 이동

27에서 rightNode 있는지 확인, 28 발견 했으므로 rightNode 이동한다

이때 주의할점은 rightNode 한번 갈때는

가장 끝의 rightNode까지 이동해야한다는것이다

여기서 나오는 rightNode들은 27 29사이의 수들이다

가장끝 rightNode 수록 29 가까운 바로 아랫수가 될것이다

그러나 28 끝이므로 28에서 멈춘다

 

 

28

28 leftNode 없다 root 이동해야 하는데,

root 이동할때는 왼쪽으로 뻗은길이면 한번만 이동하면되고

오른쪽으로 뻗은길이면 왼쪽으로 뻗은길이 나올때까지 계속 이동해야 한다

(28 > root->iData)조건을 만족할때까지

그런데 왼쪽으로 뻗은길 28 root->iData 27보다 크므로

한번만 이동한다

 

 

 

27

LeftNode 있으므로, leftNode 이동

26에서 멈추고 rightNode 있는지 확인, 없으므로 그자리에 대기

 

 

 

26

leftNode,RightNode 둘다 없으므로 아까처럼 root 타야한다

그런데 오른쪽길로 뻗어있다 (26 < pRoot->iData) 식이 되므로

26 > pRoot->iData 조건이 만족할때까지 계속 이동한다

그렇게 하면 27, 29, 30,(셋다 전부 26보다 크다) 거쳐서 13 도착한다 ( 26보다 작은수)

26보다 작은수가 나올때까지 계속 이동한것이다

13에서 대기한다

 

 

13

leftNode 확인하고, 11 있으므로 11 이동, rightNode 확인한다

그러나 rightNode 없으므로 11에서 대기 한다

 

 

11

13에서 대기한다 leftNode, RightNode 없으므로 root 올라가는데 마찬가지로

왼쪽으로 뻗은길을 찾을때까지 계속올라간다, 그러나 바로 왼쪽으로 뻗으므로 13 > (pRoot->iData == 10)

바로 한칸 이동한다

 

 

10(phead)

head 도달 이때도 마찬가지로 leftNode 확인 4 있으므로 4 이동한뒤

rightNode 확인한다

없으므로 ,4에서 대기한다

 

4

끝에 도달

 

그림으로 그리면 위와 같다,

위의 경로를 패턴화 시키면

아래와 같은 순서로 동작한다

 

1.LeftNode 확인, LeftNode 있는경우 이동

그리고 rightNode 있는경우 가장 끝의 rightNode까지 이동

 

2.LeftNode 없으므로 Root 이동 이때

해당 노드 데이터가 root 데이터보다 큰경우가 올때까지 계속

root 이동(왼쪽으로 뻗은길이 나올때까지 이동)

 

그래서 코드로 정리하면

 

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
void operator -- ()
{
    assert(m_pNode != nullptr);
 
    if (m_pNode->m_pLeftNode != nullptr)
    {
        m_pNode = m_pNode->m_pLeftNode;
        while(m_pNode->m_pRightNode != nullptr)
        {
            m_pNode = m_pNode->m_pRightNode;
        }
        return;
    }
    else if (m_pNode->m_iData > m_pNode->m_pRootNode->m_iData)
    {
        m_pNode = m_pNode->m_pRootNode;
        return;
    }
 
    while (m_pNode->m_iData < m_pNode->m_pRootNode->m_iData)
    {
        m_pNode = m_pNode->m_pRootNode;
    }
    m_pNode = m_pNode->m_pRootNode;
}
cs

 

위와 같은 코드가 나온다

반응형
반응형

차 메쉬를 Unreal Engine 에서 Import 한뒤 Vehicle Pawn에 Skeletal Mesh로 사용하여

필드위에 Vehicle Pawn을 놓았더니 위와 같은 버그가 발생함

 

 

 

해결

Bone 의 위치가 잘못되어있었음

Skeletal Mesh의 X축이 정방향이라는 기준으로 

아래와 같은 위치에 있어야 함

 

올바른 예시

 

 

 

 

 

잘못된 예시

 

잘못된 예시

 

 

 

 

반응형

'GameProgramming > Unreal' 카테고리의 다른 글

배그 인벤토리창 캐릭터 랜더링 구현  (0) 2019.08.19
반응형

Reloading System

 

1stWeaponAmmo/BagRifleAmmo

 

- BagRifleAmmo == 0

ex 1) 0/0 -> 불가능

ex 2) 25/0  -> 불가능

 

1stWeaponAmmo + BagRifleAmmo < MaxAmmo and BagRifleAmmo < ProvideAmmo

ex 3) 0/25 -> 1stWeaponAmmo = BagRifleAmmo, BagRifleAmmo = 0  

-> 25/0

 

1stWeaponAmmo + BagRifleAmmo < MaxAmmo and BagRifleAmmo >= MaxAmmo 

ex 4) 0/40 ->1stWeaponAmmo = MaxAmmo, BagRifleAmmo = BagRifleAmmo - MaxAmmo   

-> 30/10

 

 

1stWeaponAmmo > 0 and BagRifleAmmo >= MaxAmmo 

ex 5) 25/30 -> 1stWeaponAmmo = MaxAmmo ,

BagRifleAmmo = BagRifleAmmo - (MaxAmmo - 1stWeaponAmmo)

 -> 30/25

 

ex 6) 25/110 -> 1stWeaponAmmo = MaxAmmo ,

BagRifleAmmo = BagRifleAmmo - (MaxAmmo - 1stWeaponAmmo)

-> 30/105

 

 

1stWeaponAmmo > 0 and BagRifleAmmo < MaxAmmo 

ex 7) 25/28-> 1stWeaponAmmo = MaxAmmo ,

BagRifleAmmo = BagRifleAmmo - (MaxAmmo - 1stWeaponAmmo)

-> 30/23

 

 

1stWeaponAmmo + BagRifleAmmo < MaxAmmo 

Ex 8) 24/5 ->

 

-> 29/0

반응형

'develop-note > Unreal_BattleGround' 카테고리의 다른 글

Customize Skin 동기화 버그  (0) 2019.08.20
반응형

Lobby 화면에서 PlayerCharacter의 스킨을 설정한뒤 저장(Save)하여 나중에 

Match나 Dedicated Server에 들어갔을때 Load Game from Slot 을 통해 

Skin 데이터를 불러와서

동기화를 시키는데 모든 플레이어에게 동기화 되버리는 버그 발생

Skin Customize 화면
저장해둔 Skin 데이터를 Load 하여 동기화 시키는 로직

원인 : 서버/GameMode 에서 PlayerCharacter를 Spawn 시킬때 동기화를 시작한다

이때 GetPlayerController(PlayerIndex) 함수를 썼는데

클라이언트에서는 0번이 자기자신의 컨트롤러를 뜻하지만, 서버에서는 0번이 실제 0번째 플레이어를 뜻하므로

0번째 플레이어 컨트롤러의 Skin 데이터를 적용한다가 되버린다

 

 

 

 

해결

동기화 로직을 서버/GameMode 에서 PlayerCharacter/BeginPlay 에서 처리하도록 옮겼다

 

Load Game from Slot 을 통해 데이터를 불러온뒤 PlayerController 객체에 변수로 저장해둠
PlayerCharacter/BeginPlay, 이때 GetController를 통해 올바른 데이터를 가진 컨트롤러를 가져온다

 

 

 

반응형

'develop-note > Unreal_BattleGround' 카테고리의 다른 글

Reloading System  (0) 2019.09.02
반응형

 

배그에서는 인벤토리 창을 열면 위와같이 캐릭터 외관을 렌더링 해준다 

비슷하게나마 구현하는 법 강좌를 찾았는데 https://www.youtube.com/watch?v=mSDgMmaddJw

실제 멀티플레이에서는 어떻게 PlayerCharacter와 동기화 시키는 지는 안나와있다

아래방법은 위강좌에 보충하여 데이터 동기화 하는법까지 나와있다

 

  • Actor를 만들기
  • RenderTarget 만들고 UI Material 만들기
  • Widget 블루프린트 작성, PlayerCharacter 데이터 동기화 준비
  • PlayerController 에서 액터 스폰
  • Recording 액터에서 데이터 동기화 하기

 

 

1.RecordingActor는 Actor클래스이다 SceneCaptureComponent2D 를 추가한뒤 PlayerCharacter와 똑같은 메쉬 정보를 한뒤 그것을 캡쳐하여 RenderTarget을 만든다
2.RenderTarget의 사이즈를 알맞게 맞춘다 보통 ( x:y = 1.5 : 2 )

 

 

3.Material을 만든뒤 Material Domain : 유저 인터페이스 BlendMode : Translucent

 

 

 

 

4.WidgetBP 를 만든뒤 Custom Scale로 아까 RenderTarget 사이즈와 맞춘다 Image를 추가 하고 RenderTaget Material을 Image로 셋팅한다

 

 

 

5. PlayerContorller   객체에서   Spawn  한뒤   변수로   승격하여   Reference 를   가지고   있는다

 

 

 

 

 

 

6.아까 만든 WidgetBP 에선 Construct 이벤트시 playerController가 가지고 있는 RecordingActor 레퍼런스를 변수로 승격하여 가지고 있는다 또한 GetControlledPawn을 통해 PlayerCharacter를 가지고 온후 RecordingActor의 변수로 가지고 있는 playerCharacter에 Set 시킨다

Recording Actor 에서는 Tick 이벤트를 통해 PlayerCharacter 레퍼런스를 통해 Mesh 정보들을 동기화 시킨다

 

 

 

 

 

 

결과 화면

활성레벨   에디터   뷰포트로   플레이할시   이렇게   나오는데

 

 

 

그러나 실제 Shipping 하면 잘나온다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'GameProgramming > Unreal' 카테고리의 다른 글

차 Mesh 땅에 반쯤 가라앉는 버그  (0) 2019.09.02
반응형

Oracle 기본 -3


1.GROUP BY

특정 그룹(컬럼)으로 묶어 GROUP 함수와 같이 사용해서 

합계(SUM), 평균(AVG), 최대(MAX), 최소(MIN), 갯수(COUNT) 값들을 구해줌

그러므로 SELECT 뒤에는 기준컬럼 하나만 쓰고 나머지는 GROUP 함수들을 써줌


-- 문법 양식

SELECT 기준컬럼

FROM 테이블

GROUP BY 기준컬럼;



-- SELECT 뒤의 컬럼과 GROUP BY의 기준컬럼이 일치해야됨;






2.GROUP 함수


문법 양식

SELECT 기준컬럼, AVG(적용할 컬럼), MIN(적용할 컬럼), MAX(적용할 컬럼)

FROM 테이블

GROUP BY 기준컬럼;


AVG(적용할 컬럼)



MIN(적용할 컬럼), MAX(적용할 컬럼)



 

SUM(적용할 컬럼) , COUNT(적용할 컬럼)














3.HAVING

GROUP BY 기준컬럼이나 GROUP함수에 조건을 줄때 즉, 사용 결과에 필터링 해주는 역할



SELECT 기준컬럼, AVG(적용할 컬럼), MIN(적용할 컬럼), MAX(적용할 컬럼)

FROM 테이블

GROUP BY 기준컬럼

HAVING 조건절;





평균 연봉 2000이상 출력




평균연봉 2000이상 3000이하





직무가 매니저, 이미 직무 별로 묶어놨으므로 ROW는 하나만 나옴







반응형
반응형

package com.myboard.aop;


import java.sql.Date;


import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

import org.springframework.stereotype.Component;

import org.springframework.util.StopWatch;


@Aspect

@Component

public class AroundExample {

public AroundExample() {

System.out.println("/////////////////Asepect생성/////////Asepect생성////////////Asepect생성////////Asepect생성");

}

@Pointcut("execution(* com.myboard.web.controller.BoardController.postInsert(..))")  

public void insertBoard(){}//pointcut name  

      

    @Around("insertBoard()")//applying pointcut on before advice  

    public Object myadvice(ProceedingJoinPoint pjp) throws Throwable   

    {  

        StopWatch watch = new StopWatch();

        watch.start();

        Object obj=pjp.proceed();  

        watch.stop();

        Double elapsedTimeBySecond = watch.getTotalTimeSeconds();

        System.out.println("──────────────────────────insertBoard 메소드 소요시간 = "+elapsedTimeBySecond+"초───────────────────────────");

        return obj;  

    }  


}



위와같은 Aspect를 만들고 insert 쿼리 메소드중 하나에 Around Advice를 통해 시간체크를 하려고 했다

그러나 콘솔창에 로그가 찍히지 않았다

분명 Bean으로 올라가긴 갔는데,,,
("/////////////////Asepect생성/////////Asepect생성////////////Asepect생성////////Asepect생성" 
이로그는 뜸)
 



해결

알고보니 @EnableAspectJAutoProxy 을 달아줘야 되는것이었다




수정된 코드



@EnableAspectJAutoProxy //←이 부분

@Aspect

@Component

public class AroundExample {

public AroundExample() {

System.out.println("/////////////////Asepect생성/////////Asepect생성////////////Asepect생성////////Asepect생성");

}

@Pointcut("execution(* com.myboard.web.controller.BoardController.postInsert(..))")  

public void insertBoard(){}//pointcut name  

      

    @Around("insertBoard()")//applying pointcut on before advice  

    public Object myadvice(ProceedingJoinPoint pjp) throws Throwable   

    {  

        StopWatch watch = new StopWatch();

        watch.start();

        Object obj=pjp.proceed();  

        watch.stop();

        Double elapsedTimeBySecond = watch.getTotalTimeSeconds();

        System.out.println("──────────────────────────insertBoard 메소드 소요시간 = "+elapsedTimeBySecond+"초───────────────────────────");

        return obj;  

    }  


}





정상 실행 화면


반응형
반응형

로그

빌드시 아래와 같이 Server startup 로그만 나오고 

index.jsp 를 실행해도 

404 에러만 뜸

그러나 어떠한 에러로그도 뜨지않고 위처럼 Server startup 로그만 뜸




해결

1.STS종료


2.

.m2/repository/ 안에 모든 폴더 완전삭제


3.STS실행뒤 STS가 .m2/repository/를 다시 초기화 하기 위해서 5분정도 시간이 소요됨 얌전히 기다림


그뒤 프로젝트들 전부다 느낌표 뜰텐데, 프로젝트 아무거나 하나 maven update 해줌


4.느낌표 사라지고 서버 clean 해주고 다시 해당 프로젝트 빌드,

로그가 정상적으로 뜨면서 정상실행됨




정상 실행 화면










반응형

+ Recent posts