[Spring] Spring Controller 에서 외부 URL로 redirect 하기.

|

Spring 웹 어플리케이션 내의 페이지가 아닌 외부 URL로 redirect 하고 싶을 경우 아래와 같이 다양한 방법으로 redirect 가 가능하다.


import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;


@Controller
public class ExRedirectController {
   // return string
   @GetMapping("/ex_redirect1")
   public String exRedirect1() {
       return "redirect:http://www.naver.com";
   }
   // return ModelAndView
   @GetMapping("/ex_redirect2")
   public ModelAndView exRedirect2() {
       String projectUrl = "redirect:http://www.naver.com";
       return new ModelAndView("redirect:" + projectUrl);
   }
   
   // httpServletResponse.sendRedirect
   @GetMapping("/ex_redirect3")
   public void exRedirect3(HttpServletResponse httpServletResponse) throws IOException {
       httpServletResponse.sendRedirect("https://naver.com");
   }
   
   // RedirectView 
   @RequestMapping("/ex_redirect4")
   public RedirectView exRedirect4() {
       RedirectView redirectView = new RedirectView();
       redirectView.setUrl("http://www.naver.com");
       return redirectView;
   }
   
   // httpHeaders
   @RequestMapping("/ex_redirect5")
   public ResponseEntity<Object> exRedirect5() throws URISyntaxException {
       URI redirectUri = new URI("http://www.naver.com");
       HttpHeaders httpHeaders = new HttpHeaders();
       httpHeaders.setLocation(redirectUri);
       return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
   }
}

참고자료 :

  • https://code-examples.net/ko/q/111fbc1
  • https://stackoverflow.com/questions/17955777/redirect-to-an-external-url-from-controller-action-in-spring-mvc

Docker를 통한 MySQL 설치하기.

|

2020-02-26 에 한글깨짐 관련 내용 추가 함.

이 글에선 docker에서 MySQL을 설정하는 방법과 docker를 통해 설치한 MySQL에 접근 방법에 대해 알아본다.

Docker가 무엇인지 알고, MySQL을 사용하는 방법을 이해하고 SQL 명령을 사용하여 사용자를 생성하고, 데이터베이스를 만들고, 권한을 부여하는 방법을 이해하고 있다고 가정한다.

docker가 설치되어 있다고 가정하였고 Mac OS에 설치하였다.

1. 도커 버전 확인

docker --version

2. MySQL Docker 이미지 다운로드

아래 명령어를 통해 MySQL 8.0.17 태그 이미지를 다운로드한다.
태그에는 MySQL 버전을 명시하며. 만약 태그에 버전을 명시하지 않으면, 최신 버전인 latest를 가져온다.

docker pull mysql:8.0.17

docker hub에서 내려받을 수 있는 mysql 버전 참고 : https://hub.docker.com/_/mysql/

Docker 이미지 확인

docker images

3. Docker MySQL 컨테이너 생성 및 실행

  • 호스트의 /Users/{내계정}/datadir 디렉토리를 컨테이너의 /var/lib/mysql 디렉토리로 마운트
  • docker에 mysql과 같은 DB를 설치하는 경우 컨테이너 삭제와 함께 데이터도 날라가므로, 저장소는 반드시 외부 저장소를 사용한다.

ex) -v /Users/jmlim/datadir:/var/lib/mysql

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name jmlim-mysql -v /Users/jmlim/datadir:/var/lib/mysql mysql:8.0.17
  • 하지만 위 명령어로 실행하여 mysql db를 생성하여 개발 시 한글문제가 발생 할 것이다.
  • 한글이 깨지지 않도록 설정하려면 아래 인자값을 넣어주어야 한다.
 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

ex )

 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name jmlim-mysql -v /Users/jmlim/datadir:/var/lib/mysql mysql:8.0.17 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

위 명령어를 실행하여 컨테이너를 올려도 되지만 아래와 같이 docker-compose.yml 파일로 만들어서 실행할 수 있다.

  • 장황환 도커 옵션을 한눈에 볼 수 있어 편하다.

docker-compose.yml 파일 생성.

version: "3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  db: # 서비스 명
    image: mysql:8.0.17 # 사용할 이미지
    container_name: jmlim-mysql # 컨테이너 이름 설정
    ports:
      - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: "password"  # MYSQL 패스워드 설정 옵션
    command: # 명령어 실행
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /Users/jmlim/datadir:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)

실행 docker-compose 파일 실행

  • docker-compose.yml 작성한 위치에서 실행
  • 백그라운드로 실행 시 옵션 -d 붙이면 됨.
    • 자세한건 옵션 참고
docker-compose up -d

4. Docker 컨테이너 목록 출력

docker ps -a

5. MySQL 컨테이너 bash 쉘 접속

docker exec 명령을 사용하여 docker 컨테이너에 접근한 다음 MySQL에 로그인한다.

docker exec -it jmlim-mysql bash

6. MySQL 서버 접속

로컬에서 mysql를 설치하고 접속하는 방법과 동일. 패스워드는 MySQL 컨테이너를 실행할 때 지정한 정보를 입력한다.

  • MYSQL_ROOT_PASSWORD = password
root@f3af78fa6428:/#mysql -u root -p

mysql>

7. 데이터베이스와 사용자를 생성하고 (컨테이너 내에서) MySQL에서 권한을 부여한다.

  • jmlim이라는 사용자를 생성하고, 모든 권한을 부여한다.
  • 변경된 권한 적용

중요 : 컨테이너 외부에서 MySQL에 로그인도 가능해야 하므로 jmlim@localhost에서 localhost 대신 %를 사용한다.

mysql> CREATE USER 'jmlim'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'jmlim'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit

8. 연결 테스트를 해본다.

외부에 있는 윈도우 피시의 HeidiSQL 툴로 접근 테스트 결과 잘 된다.

참고자료:

  • https://jayden-lee.github.io/post/docker/mysql-install
  • https://dzone.com/articles/docker-for-mac-mysql-setup
  • https://hub.docker.com/_/mysql
  • https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose

Java MD5 hexdigest 샘플 코드.

|

Md5Utils.java


import java.security.MessageDigest;
import java.math.BigInteger;

class Md5Utils {
   private String message;
   public Md5Utils( String message ) {
       this.message = message;
   }
   public String hexdigest() throws Exception {
       String hd;
       MessageDigest md5 = MessageDigest.getInstance( "MD5" );
       md5.update( this.message.getBytes() );
       BigInteger hash = new BigInteger( 1, md5.digest() );
       hd = hash.toString(16); // BigInteger strips leading 0's
       while ( hd.length() < 32 ) { hd = "0" + hd; } // pad with leading 0's
       return hd;
   }
   public static void main( String[] args ) throws Exception {
       for ( String message: args ) {
           System.out.println( new MD5( message ).hexdigest() );
       }
   }
}

출처:

  • https://pad.yohdah.com/101/python-vs-java-md5-hexdigest

인텔리제이 FTP 연동하여 서버에 있는 소스 쉽게 수정하기.

|

사실 자바로 웹 개발시 직접 서버 붙어서 수정하고.. 뭐 그런경우는 이제 별로 없다.

그런데 최근에 루비 온 레일즈로 된 소스를 분석할 일이 생겼다.
서버에 있는 소스 보고 수정하고 확인하는게 여간 불편한 일이 아니었다.
다행히 인텔리제이 라이센스가 있고 인텔리제이의 FTP 기능을 통해 소스를 로컬에 내려받고 수정시마다 서버에 쉽게 반영할 수 있었다.

FTP 연동 방법

서버엔 내가 수정하고 테스트 할 수 있는 소스가 이미 내려받아 있다고 가정한다.

1. intellij 에서 프로젝트를 생성한다.

  • 루비 플러그인 설치 후 루비 프로젝트로 생성하였다.
  • 프로젝트 성격에 따라 생성하면 된다.

2. intellij 상단메뉴 tools -> Deployment -> Configuration에 접근한다.

2.1. 왼쪽 상단의 + 버튼으로 커넥션 이름 추가 후 Connection 탭에 sftp 로 접근할 호스트 및 계정정보, 소스 내려받은 root path 정보를 작성 한다.

3. Connection 탭 옆의 Mappings 탭에 Deployment path를 지정한다.

  • 아까 root path 에 지정했던 정보를 지정하면 된다.

4. 지정 후 intellij 상단메뉴 tools -> Deployment -> Browse Remote Host 에 가서 아까 Configuration에 지정한 호스트 선택 후 접근이 되어 파일 확인을 해본다.

5. Browse Remote Host 의 루트 폴더 선택

  • 우측 클릭 후 Download from here 선택하여 소스를 로컬에 내려 받는다.

6. 위까지 되었으면 Deployment 메뉴 선택 시 upload to 리모트 호스트 정보 .. Download from 호스트 정보 등등 여러가지가 생긴다.

  • Sync with Deployed to 리모트 호스트 정보로 소스가 동기화가 되어있는 상태인지.. 파일명은 깨지지 않았는지 살핀다.

7. 이제 소스 수정 후 동기화 한 다음 Deployment -> upload to 호스트 정보로 소스를 쉽게 올릴 수 있다.

8. intellij 상단메뉴 tools -> Deployment -> Automatic Upload 를 선택하면 소스 수정할 때마다 자동으로 반영이된다.

  • 이미 반영이 되고 나면 되돌릴 수 없으므로 주의한다.

참고자료:

  • https://0penster.tistory.com/22
  • https://www.jetbrains.com/help/idea/creating-a-remote-server-configuration.html

Linux 에서 cp 명령시 오류 (omitting directory 'directory name') 발생시 해결 방법

|

현상이 발생하는 이유

  • 해당 디렉토리가 사용중일 경우
  • 하위 디렉토리는 복사를 하지 않을때

아래와 같이 -r 옵션을 사용하여 해결 가능하다.

cp -r [원본디렉토리] [복사할위치]

출처:

  • https://ukthe33.tistory.com/entry/cp-%EB%AA%85%EB%A0%B9%EC%8B%9C-%EC%98%A4%EB%A5%98-omitting-directory-directory-name