페이지

2021년 11월 29일 월요일

Tomcat 9 HTTPS 설정 기초

Tomcat 9 HTTPS 설정 기초

1. 개요

1.1. 목적

  • Tomcat 서버에 HTTPS 연결을 추가하는 방법에 대하여 설명합니다.

1.2. 환경

  • 운영체제: Windows 10
  • Java 버전: 8
  • Tomcat 버전: 9

1.3. 표기

다음 세 개의 값은 원하는 다른 값으로 지정할 수 있습니다.

  • your-alias
  • your-file
  • your-password

2. 키 저장소 및 키 생성

  1. 키 저장소와 키를 생성합니다. 키 비밀번호를 입력하는 단계에서 비밀번호를 입력하지 말고 그냥 Enter 키를 누릅니다. Tomcat에서 사용하기 위해서는 키 저장소와 키의 비밀번호가 같아야 합니다.
    >keytool -genkey -alias your-alias -keyalg RSA -keystore your-file.keystore  
    키 저장소 비밀번호 입력:  
    새 비밀번호 다시 입력:  
    이름과 성을 입력하십시오.  
     [Unknown]:  TOMCAT
    조직 단위 이름을 입력하십시오.  
     [Unknown]:  TOMCAT
    조직 이름을 입력하십시오.  
     [Unknown]:  TOMCAT
    구/군/시 이름을 입력하십시오?  
     [Unknown]:  SEOUL  
    시/도 이름을 입력하십시오.  
     [Unknown]:  SEOUL  
    이 조직의 두 자리 국가 코드를 입력하십시오.  
     [Unknown]:  82  
    CN=TOMCAT, OU=TOMCAT, O=TOMCAT, L=SEOUL, ST=SEOUL, C=82이(가) 맞습니까?  
     [아니오]:  예  
    ​  
    <your-alias>에 대한 키 비밀번호를 입력하십시오.  
     (키 저장소 비밀번호와 동일한 경우 Enter 키를 누름):  
    ​  
    Warning:  
    JKS 키 저장소는 고유 형식을 사용합니다. "keytool -importkeystore -srckeystore your-file.keystore -destkeystore your-file.keystore -deststoretype pkcs12"를 사용하는 산업 표준 형식인 PKCS12로 이전하는 것이 좋습니다.
    
  2. JKS 키 저장소를 PKCS12로 이전합니다.
    >keytool -importkeystore -srckeystore your-file.keystore -destkeystore your-file.keystore -deststoretype pkcs12  
    소스 키 저장소 비밀번호 입력:  
    your-alias 별칭에 대한 항목이 성공적으로 임포트되었습니다.  
    임포트 명령 완료: 성공적으로 임포트된 항목은 1개, 실패하거나 취소된 항목은 0개입니다.  
    ​  
    Warning:  
    "your-file.keystore"을(를) Non JKS/JCEKS(으)로 이전했습니다. JKS 키 저장소가 "your-file.keystore.old"(으)로 백업되었습니다.
    
  3. 인증서 목록을 확인합니다.
    >keytool -list -keystore your-file.keystore  
    키 저장소 비밀번호 입력:  
    키 저장소 유형: PKCS12  
    키 저장소 제공자: SUN  
    ​  
    키 저장소에 1개의 항목이 포함되어 있습니다.  
    ​  
    your-alias, 2021. 11. 30, PrivateKeyEntry,  
    인증서 지문(SHA1): 46:0A:69:93:A3:61:8A:F6:00:80:5A:A5:5A:5B:B1:23:9F:6F:FF:A8
    

3. Tomcat 9 설정

  1. %CATALINA_HOME%\conf\server.xml 파일에 아래의 내용을 추가합니다.
    <Connector port="8443" maxThreads="150" scheme="https" secure="true" SSLEnabled="true"   
     keystoreFile="\path\to\your-file.keystore" keystorePass="your-password"   
     clientAuth="false" keyAlias="your-alias" sslProtocol="TLS"/>
    
  2. Tomcat을 재시작합니다.
    >catalina.bat stop
    >catalina.bat start
    

4. 참고 문서

Written with StackEdit.

2021년 11월 8일 월요일

Spring Web + MyBatis + MySQL + Tomcat 사용 기초

Spring Web + MyBatis + MySQL + Tomcat 사용 기초

사용 환경

  • Windows 10
  • Java 1.8
  • Gradle 7.2
  • Spring Boot 2.5.6
  • MyBatis 2.2.0
  • MySQL 5.7
  • Tomcat 9, 10

프로젝트 따라하기

  1. 프로젝트 생성

    브라우져에서 spring initializr를 방문하여 아래와 같이 입력하고 GENERATE 버튼을 클릭합니다.

    • Project: Gradle Project
    • Language: Java
    • Spring Boot: 2.5.6
    • Project Meta:
      • Group: trvoid
      • Artifact: mysql-mybatis
      • Name: mysql-mybatis
      • Package name: trvoid.mybatis
      • Packaging: War
      • Java: 8
    • Dependencies:
      • Spring Web
      • JDBC API
      • MyBatis Framework
      • MySQL Driver

    생성된 프로젝트 파일을 다운로드하여 압축을 풉니다. 프로젝트 폴더 구조는 아래와 같습니다.

    mysql-mybatis
      |-src
        |-main
          |-java
            |-trvoid.mybatis
              |-MysqlMybatisApplication.java
              |-ServletInitializer.java
          |-resources
            |-application.properties
        |-test
          |-java
            |-trvoid.mybatis
              |-MysqlMybatisApplicationTests.java
      |-build.gradle
      |-gradlew.bat
    

    build.gradle

    plugins {
        id 'org.springframework.boot' version '2.5.6'
        id 'io.spring.dependency-management' version '1.0.11.RELEASE'
        id 'java'
        id 'war'
    }
    
    group = 'trvoid'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-jdbc'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
        runtimeOnly 'mysql:mysql-connector-java'
        providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    
    test {
        useJUnitPlatform()
    }
    

    src/main/java/trvoid/mybatis/MysqlMybatisApplication.java

    package trvoid.mybatis;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class MysqlMybatisApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MysqlMybatisApplication.class, args);
        }
    
    }
    

    src/main/java/trvoid/mybatis/ServletInitializer.java

    package trvoid.mybatis;
    
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    
    public class ServletInitializer extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(MysqlMybatisApplication.class);
        }
    
    }
    
  2. 데이터 소스 설정

    applicaton.properties 파일을 삭제하고 applicaton.yml 파일을 추가하여 데이터 소스를 설정합니다.

    src/main/resources/application.yml

    spring:
      profiles:
        active: local
    
    ---
    
    spring:
      profiles: local
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/my_test_db
        username: u1234
        password: p1234
    
  3. @Mapper 추가

    src/main/java/trvoid/mybatis/model/Car.java

    package trvoid.mybatis.model;
    
    public class Car {
        private int id;
        private String model;
        private String manufacturer;
        
        public Car() {
        
        }
        
        public Car(int id, String model, String manufacturer) {
            this.id = id;
            this.model = model;
            this.manufacturer = manufacturer;
        }
    
        // getters and setters
    
        @Override
        public String toString() {
            return String.format("id:%d, model:%s, manufacturer:%s", id, model, manufacturer);
        }
    }
    

    src/main/java/trvoid/mybatis/mapper/CarMapper.java

    package trvoid.mybatis.mapper;
    
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    import trvoid.mybatis.model.Car;
    
    import java.util.List;
    
    @Mapper
    public interface CarMapper {
        String SELECT = " SELECT ID, MODEL, MANUFACTURER FROM CAR ";
    
        @Select(" SELECT COUNT(1) FROM ALL_OBJECTS " +
                " WHERE OBJECT_TYPE = 'TABLE' AND OBJECT_NAME = 'CAR' ")
        int countTable();
    
        @Insert(" CREATE TABLE CAR ( " +
                "    ID NUMBER(10) NOT NULL, " +
                "    MODEL VARCHAR2(100) NOT NULL, " +
                "    MANUFACTURER VARCHAR2(100) NULL, " +
                "    CONSTRAINT CAR_PK PRIMARY KEY (ID) " +
                " ) ")
        void createTable();
    
        @Insert(" INSERT INTO CAR ( " +
                "    ID, MODEL, MANUFACTURER " +
                " ) VALUES ( " +
                "    #{car.id}, #{car.model}, #{car.manufacturer,jdbcType=VARCHAR} " +
                " ) ")
        void insertCar(@Param("car") Car car);
    
        @Select(SELECT + " WHERE ID = #{carId} ")
        Car getCar(@Param("carId") String carId);
    
        @Select(SELECT)
        List<Car> findAll();
    }
    
  4. 컨트롤러 추가

    src/main/java/trvoid/mybatis/controller/MainController.java

    package trvoid.mybatis.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    import trvoid.mybatis.mapper.CarMapper;
    import trvoid.mybatis.model.Car;
    
    @RestController
    public class MainController {
        @Autowired
        CarMapper carMapper;
    
        @GetMapping("/")
        public String main() {
            return "hello";
        }
    
        @GetMapping("/car/{id}")
        public Car car(@PathVariable String id) {
            Car car = carMapper.getCar(id);
            return car;
        }
    }
    
  5. WAR 파일 생성

    gradlew build
    

    빌드 결과로 다음 파일이 생성됩니다.

    • build/libs/mysql-mybatis-0.0.1-SNAPSHOT.war
    • build/libs/mysql-mybatis-0.0.1-SNAPSHOT-plain.war
  6. Tomcat 9에 배포

    1. Tomcat을 실행합니다.
    2. WAR 파일의 이름을 mysql-mybatis.war로 변경하여 Tomcat의 webapps 폴더 아래에 복사합니다.
    3. 브라우져에서 http://localhost:8080/mysql-mybatis/car/1 URL에 접속합니다.
    4. 화면에 아래와 같은 내용이 표시되는지 확인합니다.
      {
          "id": 1,
          "model": "J1",
          "manufacturer": "James"
      }
      
    5. Tomcat을 종료합니다.
  7. Tomcat 10에 배포

    1. Tomcat을 실행합니다.
    2. WAR 파일의 이름을 mysql-mybatis.war로 변경하여 Tomcat의 webapps-javaee 폴더 아래에 복사합니다.
    3. 브라우져에서 http://localhost:8080/mysql-mybatis/car/1 URL에 접속합니다.
    4. 화면에 아래와 같은 내용이 표시되는지 확인합니다.
      {
          "id": 1,
          "model": "J1",
          "manufacturer": "James"
      }
      

Written with StackEdit.

Spring Web + Tomcat 사용 기초

Spring Web + Tomcat 사용 기초

사용 환경

  • Windows 10
  • Java 1.8
  • Gradle 7.2
  • Spring Boot 2.5.6
  • Tomcat 9, 10

프로젝트 따라하기

  1. 프로젝트 생성

    브라우져에서 spring initializr를 방문하여 아래와 같이 입력하고 GENERATE 버튼을 클릭합니다.

    • Project: Gradle Project
    • Language: Java
    • Spring Boot: 2.5.6
    • Project Meta:
      • Group: trvoid
      • Artifact: war-api
      • Name: war-api
      • Package name: trvoid.api
      • Packaging: War
      • Java: 8
    • Dependencies:
      • Spring Web

    생성된 프로젝트 파일을 다운로드하여 압축을 풉니다. 프로젝트 폴더 구조는 아래와 같습니다.

    war-api
      |-gradle
      |-src
        |-main
          |-java
            |-trvoid.api
              |-ServletInitializer.java
              |-WarApiApplication.java
          |-resources
            |-application.properties
        |-test
          |-java
            |-trvoid.api
              |-WarApiApplicationTests.java
      |-build.gradle
      |-gradlew.bat
    

    build.gradle

    plugins {
        id 'org.springframework.boot' version '2.5.6'
        id 'io.spring.dependency-management' version '1.0.11.RELEASE'
        id 'java'
        id 'war'
    }
    
    group = 'trvoid'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    
    test {
        useJUnitPlatform()
    }
    
    

    src/main/java/trvoid/api/ServletInitializer.java

    package trvoid.api;
    
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    
    public class ServletInitializer extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(WarApiApplication.class);
        }
    
    }
    

    src/main/java/trvoid/api/WarApiApplication.java

    package trvoid.api;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class WarApiApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(WarApiApplication.class, args);
        }
    
    }
    
  2. 컨트롤러 추가

    src/main/java/trvoid/api/MainController.java

    package trvoid.api;  
    
    import org.springframework.web.bind.annotation.GetMapping;  
    import org.springframework.web.bind.annotation.RestController;  
    
    @RestController  
    public class MainController {  
        @GetMapping("/hello")  
        public String hello() {  
            return "Hello!!!";  
        }  
    }
    
  3. WAR 파일 생성

    gradlew build
    

    빌드 결과로 다음 파일이 생성됩니다.

    • build/libs/war-api-0.0.1-SNAPSHOT.war
    • build/libs/war-api-0.0.1-SNAPSHOT-plain.war
  4. Tomcat 9에 배포

    1. Tomcat을 실행합니다.
    2. WAR 파일의 이름을 war-api.war로 변경하여 Tomcat의 webapps 폴더 아래에 복사합니다.
    3. 브라우져에서 http://localhost:8080/war-api/hello URL에 접속합니다.
    4. 화면에 Hello!!!가 표시되는지 확인합니다.
    5. Tomcat을 종료합니다.
  5. Tomcat 10에 배포

    1. Tomcat을 실행합니다.
    2. WAR 파일의 이름을 war-api.war로 변경하여 Tomcat의 webapps-javaee 폴더 아래에 복사합니다.
    3. 브라우져에서 http://localhost:8080/war-api/hello URL에 접속합니다.
    4. 화면에 Hello!!!가 표시되는지 확인합니다.

참고 문서

Written with StackEdit.

Llama 3.2로 문장 생성 및 챗팅 완성 실습

Llama 3.2로 문장 생성 및 챗팅 완성 실습 Running Meta Llama on Linux 문서의 내용을 참고하여 Llama 3.2 1B 모델로 다음 두 가지 기능을 실습합니다. 문장 완성 챗팅 ...