반응형

/etc/nginx/conf.d 에 3개파일이 있어.
server-01.conf
server-02.conf
server-all.conf

reloadNginx.sh 01 이렇게 실행하면 
server-01.conf 파일은 그대로고
나머지 파일은 뒤에 .bak 이 붙고
nginx를 reload하는 우분투 스크립트를 작성해줘

 

#!/bin/bash

if [ -z "$1" ]
then
  echo "Please provide a parameter"
  exit 1
fi

# /etc/nginx/conf.d 디렉토리로 이동
cd /etc/nginx/conf.d

# server-01.conf, server.conf, server-all.conf 중에서 입력받은 숫자에 해당하지 않는 파일을 찾아 .bak으로 이름 변경
for file in server-*.conf
do
  if [[ "$file" != "server-$1.conf" ]]
  then
    mv "$file" "${file%.conf}.bak"
  fi
done

# nginx를 reload
sudo service nginx reload

# 스크립트 종료
exit 0

이 상태에서 ./reloadNginx.sh 02 를 실행하면 02의 bak를 없애고 01은 bak를 붙여야해

#!/bin/bash

if [ -z "$1" ]
then
  echo "Please provide a parameter"
  exit 1
fi

# /etc/nginx/conf.d 디렉토리로 이동
cd /etc/nginx/conf.d

# server-*.conf 혹은 server-*.bak 중에서 입력받은 숫자에 해당하는 파일을 찾아 .conf로 이름 변경
if [ -f "server-$1.bak" ]
then
  mv "server-$1.bak" "server-$1.conf"
fi

# server-*.conf 중에서 입력받은 숫자에 해당하지 않는 파일을 찾아 .bak으로 이름 변경
for file in server-*.conf
do
  if [[ "$file" != "server-$1.conf" ]]
  then
    mv "$file" "${file%.conf}.bak"
  fi
done

# nginx를 reload
sudo service nginx reload

# 스크립트 종료
exit 0

 

파라미터가 01, 02, all 이 셋중에 하나가 아니면 오류

 

#!/bin/bash

# 파라미터 값 확인
if [ "$1" != "01" ] && [ "$1" != "02" ] && [ "$1" != "all" ]
then
  echo "Error: Parameter must be either '01', '02', or 'all'"
  exit 1
fi

# /etc/nginx/conf.d 디렉토리로 이동
cd /etc/nginx/conf.d

# server-*.conf 혹은 server-*.bak 중에서 입력받은 숫자에 해당하는 파일을 찾아 .conf로 이름 변경
if [ -f "server-$1.bak" ]
then
  mv "server-$1.bak" "server-$1.conf"
fi

# server-*.conf 중에서 입력받은 숫자에 해당하지 않는 파일을 찾아 .bak으로 이름 변경
for file in server-*.conf
do
  if [[ "$file" != "server-$1.conf" ]]
  then
    mv "$file" "${file%.conf}.bak"
  fi
done

# nginx를 reload
sudo service nginx reload

# 스크립트 종료
exit 0
반응형
반응형

웹소켓 연동에서 STOMP를 사용할 때, 일반적으로 클라이언트의 메시지를 받기 위한 컨트롤러를 작성합니다. 이 컨트롤러는 `@MessageMapping` 애노테이션을 사용하여 클라이언트에서 보낸 메시지를 받습니다. 그리고 `SimpMessagingTemplate`를 사용하여 원하는 채팅방에 메시지를 보낼 수 있습니다.

예를 들어, 아래와 같이 구현할 수 있습니다:

```java
@Controller
public class ChatController {

    private final SimpMessagingTemplate messagingTemplate;

    @Autowired
    public ChatController(SimpMessagingTemplate messagingTemplate) {
        this.messagingTemplate = messagingTemplate;
    }

    @MessageMapping("/chat")
    public void receiveMessage(ChatMessage message) {
        // 메시지를 받는 로직
        sendMessageToChatRoom(message.getChatRoomId(), message);
    }

    public void sendMessageToChatRoom(String chatRoomId, ChatMessage message) {
        // 원하는 채팅방에 메시지를 보내는 로직
        this.messagingTemplate.convertAndSend("/topic/chatroom/" + chatRoomId, message);
    }
}
```

위 코드에서 `ChatMessage`는 채팅 메시지와 관련된 정보를 담는 클래스입니다. `chatRoomId`는 메시지를 보낼 채팅방의 ID를 나타냅니다. 

`@MessageMapping("/chat")` 애노테이션이 붙은 `receiveMessage` 메소드는 클라이언트가 `/app/chat` 주소로 메시지를 보내면 호출됩니다.

`sendMessageToChatRoom` 메소드는 `SimpMessagingTemplate`의 `convertAndSend` 메소드를 사용하여 특정 채팅방으로 메시지를 보냅니다. 이 때, `"/topic/chatroom/" + chatRoomId`는 메시지를 보낼 주소를 나타냅니다.

이렇게 하면 일반 컨트롤러를 사용하여 클라이언트의 메시지를 받고, 원하는 채팅방에 메시지를 보낼 수 있습니다.

 

-----------------

@PostMappding으로 받고 sendMessageToChatRoom 을 호출 할 수는 없을 까?

-----------------

네, `@PostMapping`을 사용하여 HTTP 요청을 받고 웹소켓을 통해 메시지를 보낼 수 있습니다. 이 경우에는 일반적인 HTTP 요청을 처리하는 방식과 동일하게 `@PostMapping` 애노테이션을 사용하면 되며, 메시지를 보낼 때 `SimpMessagingTemplate`를 사용합니다.

다음은 이를 구현한 예시입니다:

```java
@RestController
public class ChatController {

    private final SimpMessagingTemplate messagingTemplate;

    @Autowired
    public ChatController(SimpMessagingTemplate messagingTemplate) {
        this.messagingTemplate = messagingTemplate;
    }

    @PostMapping("/chat")
    public void sendMessage(ChatMessage message) {
        // 원하는 채팅방에 메시지를 보내는 로직
        this.messagingTemplate.convertAndSend("/topic/chatroom/" + message.getChatRoomId(), message);
    }
}
```

위 코드에서 `ChatMessage`는 채팅 메시지와 관련된 정보를 담는 클래스입니다. `chatRoomId`는 메시지를 보낼 채팅방의 ID를 나타냅니다.

`@PostMapping("/chat")` 애노테이션이 붙은 `sendMessage` 메소드는 클라이언트가 `/chat` 주소로 HTTP POST 요청을 보내면 호출됩니다. 이 메소드는 클라이언트로부터 받은 메시지를 원하는 채팅방으로 보냅니다.

이렇게 하면 `@PostMapping`을 사용하여 클라이언트의 요청을 받고, 웹소켓을 통해 원하는 채팅방에 메시지를 보낼 수 있습니다.

반응형
반응형

`vi` 혹은 `vim` 에디터에서 주석의 색상을 변경하는 방법은 다음과 같습니다. 

1. 먼저, 사용자의 홈 디렉토리에서 `.vimrc` 파일을 찾거나 없다면 새로 만듭니다. `.vimrc` 파일은 `vim` 에디터의 설정을 담고 있습니다. 터미널에서 다음 명령어를 실행하여 `.vimrc` 파일을 열어봅니다.

    ```bash
    vim ~/.vimrc
    ```

2. `.vimrc` 파일 안에서, 주석의 색상을 변경하려면 다음과 같은 구문을 추가합니다.

    ```vim
    highlight Comment ctermfg=yellow
    ```
    위의 예제에서는 주석의 색상을 노란색으로 변경하였습니다. 원하는 색상으로 변경하시려면 'yellow'를 다른 색상 이름으로 변경하시면 됩니다. 가능한 색상 이름에는 black, darkblue, darkgreen, darkcyan, darkred, darkmagenta, brown, darkyellow, lightgray(lightgrey), darkgray(darkgrey), blue, lightgreen, lightcyan, red, lightmagenta, yellow, white 등이 있습니다.

3. 수정이 끝났다면, `:wq`를 입력하여 `.vimrc` 파일을 저장하고 종료합니다.

이렇게 하면, `vim` 에디터를 다시 열 때부터는 새로운 색상 설정이 적용됩니다. 이러한 방식은 주석 뿐만 아니라 다른 구문 요소들에 대한 색상도 변경할 수 있습니다.

참고로, 이러한 방법은 기본 콘솔(터미널)의 색상 설정을 사용하는 `vim` 에디터에서만 작동합니다. GUI 기반의 `vim` 에디터(예: `gvim`)를 사용하는 경우, 색상 이름 대신 RGB 색상 코드를 사용해야 할 수도 있습니다.

반응형
반응형

Sure, here's an example of how you can use `curl` to POST JSON data:

Let's say you have a JSON object that you want to send as a POST request to a server:

```json
{
    "name": "John Doe",
    "email": "john.doe@example.com"
}
```

You would use `curl` in the following way:

```bash
curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe","email":"john.doe@example.com"}' http://your-server-address/your-endpoint
```

Here's what's happening in this command:

- `-X POST`: This tells `curl` to use the POST method for the request.
- `-H "Content-Type: application/json"`: This is setting a request header specifying that the content type of the data we're sending is JSON.
- `-d '{"name":"John Doe","email":"john.doe@example.com"}'`: This is the data we're sending in our POST request. The `-d` stands for "data".
- `http://your-server-address/your-endpoint`: This is the URL that you're sending the POST request to. Replace this with the actual URL for your use case.

Please replace `http://your-server-address/your-endpoint` and the JSON payload with your actual server URL and the JSON data you want to send, respectively.

 

-----------------------

스크립트로 실행 할거야. 내려쓰기로 정리좀 해줘

-----------------------

#!/bin/bash

# API endpoint URL
URL="http://your-server-address/your-endpoint"

# JSON 데이터
JSON_DATA='{
    "name":"John Doe",
    "email":"john.doe@example.com"
}'

# curl로 POST 요청
curl -X POST \
     -H "Content-Type: application/json" \
     -d "$JSON_DATA" \
     $URL

반응형
반응형

스프링 부트는 `spring-session-data-redis` 의존성이 존재하는 경우에 자동으로 Redis를 세션 저장소로 사용하려고 시도합니다. 이 동작은 자동 구성(auto-configuration)을 통해 일어납니다.

특정 프로필에서 (예를 들어, "local" 프로필에서) Redis 세션 저장소를 사용하고 싶지 않다면, 스프링 부트의 자동 구성을 비활성화해야 합니다.

자동 구성을 비활성화하려면, "local" 프로필을 위한 `application-local.properties` 또는 `application-local.yml` 파일에 다음 설정을 추가하십시오:

```properties
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.session.SessionAutoConfiguration
```

위 설정은 스프링 부트가 세션 관련 자동 구성을 수행하지 않도록 지시합니다.

다만 이 설정은 Spring Session 자체를 비활성화하는 것이므로, 세션을 사용해야 하는 다른 부분에서 문제가 발생할 수 있습니다. 이를 해결하려면 다른 세션 저장소를 직접 설정하거나, 필요한 세션 관련 빈들을 직접 구성해야 할 수도 있습니다.

반응형
반응형

Java에서 `for` 문 안에 있는 `switch` 문에서 `continue`를 사용하면, `continue`는 `switch` 문이 아닌 `for` 문에 적용됩니다. 즉, `continue`가 실행되면 `switch` 문을 빠져나가고, `for` 문의 다음 반복으로 넘어갑니다. 아래는 이를 보여주는 예제 코드입니다:

public class ContinueInSwitchExample {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            switch (i) {
                case 0:
                    System.out.println("i is 0");
                    continue;
                case 1:
                    System.out.println("i is 1");
                    break;
                case 2:
                    System.out.println("i is 2");
                    continue;
                default:
                    System.out.println("i is greater than 2");
            }
            System.out.println("End of loop iteration");
        }
    }
}



위의 코드에서, `continue`가 실행되는 경우는 `i`가 0 또는 2일 때입니다. 이 경우들에서는 "End of loop iteration" 문자열이 출력되지 않고, 바로 다음 반복으로 넘어갑니다. 그 외의 경우에는 `switch` 문에서 `break`를 만나거나, 다른 경우에 해당하므로 "End of loop iteration"이 출력됩니다.

반응형
반응형

`java.util.zip.ZipEntry` 클래스의 `getSize()` 메소드는 해당 엔트리의 원본 파일 크기를 바이트(byte) 단위로 반환합니다. 따라서 `getSize()` 메소드를 호출하여 반환된 값은 해당 파일의 크기를 바이트로 나타내는 것입니다.

예를 들어, `getSize()`가 1024를 반환한다면, 이는 해당 파일의 크기가 1024바이트, 즉 1킬로바이트임을 의미합니다.

반응형
반응형

논리 ERD(Entity Relationship Diagram)와 물리 ERD는 데이터 모델링 과정에서 사용되며, 각각 서로 다른 목적과 관점에서 데이터베이스의 구조를 표현합니다. 이들을 구분하는 이유는 다음과 같습니다.

1. **추상화 수준**: 논리 ERD는 데이터의 논리적 구조와 관계를 높은 수준의 추상화로 표현합니다. 물리 ERD는 데이터베이스의 실제 구현에 초점을 맞춰 데이터의 물리적 구조를 보여줍니다.

2. **목적과 관점**: 논리 ERD는 비즈니스 요구 사항과 데이터 요구 사항을 이해하는 데 도움이 됩니다. 물리 ERD는 실제 데이터베이스를 설계하고 구축하는 데 필요한 세부 사항을 제공합니다.

3. **세부 정보**: 논리 ERD에서는 데이터의 종류와 그 사이의 관계를 표현하지만, 물리 ERD에서는 테이블, 컬럼, 데이터 타입, 인덱스, 제약 조건 등과 같은 구현 관련 세부 정보를 제공합니다.

4. **독립성**: 논리 ERD는 데이터베이스 관리 시스템(DBMS)에 독립적입니다. 즉, 어떤 DBMS를 사용하는지와 상관없이 논리적인 구조를 표현합니다. 반면에 물리 ERD는 특정 DBMS에 종속적일 수 있으며, 해당 DBMS의 기능과 제약 사항을 반영합니다.

5. **개발 단계**: 논리 ERD는 일반적으로 요구 사항 분석과 설계 초기 단계에서 사용됩니다. 물리 ERD는 데이터베이스의 실제 구현을 시작하기 전에 사용되며, 구현 단계에서 더 구체적인 계획을 세우는 데 도움이 됩니다.

이러한 구분은 시스템을 효과적으로 설계하고 구축하는 데 도움이 되며, 논리적인 요소와 물리적인 요소 사이의 괴리를 최소화하는데 중요합니다.

반응형
반응형

Java에서 `ZipEntry`의 `getName` 메소드를 사용하여 항목의 이름을 가져올 때, 디렉토리 구분 기호(directory separator)는 항상 슬래시(`/`)로 표시됩니다. 이는 `ZipEntry`가 ZIP 파일 형식을 나타내기 때문이며, ZIP 파일 형식은 플랫폼에 상관없이 항상 슬래시를 사용하여 경로를 표현합니다.

따라서, ZIP 파일 내부의 디렉토리 구조를 확인할 때는 슬래시(`/`)를 사용하여 디렉토리와 하위 항목을 구분해야 합니다.

예를 들어, ZIP 파일에 `mydirectory/myfile.txt`라는 파일이 있을 경우, `ZipEntry`의 `getName` 메소드는 `"mydirectory/myfile.txt"`라는 문자열을 반환합니다.

반응형
반응형

MySQL 8.0 이전의 버전에서는 제시한 구문이 일반적으로 문제가 없습니다. 하지만, MySQL 8.0 이후의 버전에서는 `IDENTIFIED BY` 절은 `CREATE USER` 문에서만 사용할 수 있으며 `GRANT` 문에서는 사용할 수 없습니다. MySQL 8.0 이상에서는 사용자를 먼저 생성하고, 별도로 권한을 부여하는 접근 방식을 사용해야 합니다.

**MySQL 8.0 이전 버전**:

GRANT ALL PRIVILEGES ON 디비명.* TO '계정'@'%' IDENTIFIED BY '비밀번호' WITH GRANT OPTION;



**MySQL 8.0 이상 버전**:

먼저 사용자를 생성:

CREATE USER '디비명'@'%' IDENTIFIED BY '비밀번호';



그 다음 권한을 부여:

GRANT ALL PRIVILEGES ON 디비명.* TO '계정'@'%' WITH GRANT OPTION;



또한, 권한 변경 후에는 `FLUSH PRIVILEGES;`를 실행하여 변경 사항을 즉시 적용하는 것이 좋습니다.

FLUSH PRIVILEGES;



이렇게 분리하여 사용자를 생성하고 권한을 부여하는 방식을 사용하는 것이 좋습니다.

반응형

+ Recent posts