'ITWeb/개발일반'에 해당되는 글 489건

  1. 2022.12.14 [Python] Script 기반 파이썬 개발 진행
  2. 2022.11.01 [Groovy] Jenkins Pipeline Job 생성 시 bash 사용
  3. 2022.08.17 [Shell Script] bash script background run
  4. 2022.05.24 [Shell] Bash String Split - tr
  5. 2022.04.22 [Thymeleaf] 간만에 FE 작업 삽질 기록
  6. 2022.04.07 [Springboot+Ajax] 데이터 통신
  7. 2022.03.23 [Docker] Spring Boot App 도커 적용
  8. 2022.03.16 [Logback] JsonLayout, PatternLayout
  9. 2022.03.16 [Java] Read Properties File.
  10. 2022.03.15 [Gradle] build.gradle 에서 maven insecure protocol 설정

[Python] Script 기반 파이썬 개발 진행

ITWeb/개발일반 2022. 12. 14. 10:04

파이썬을 사용 할 때 라이브러리라 환경에 따라 동작이 제대로 되지 않는 경우가 있어서 개발 환경에 대한 표준화를 고민 하는게 좋습니다.

그냥 스크립트만 작성해서 실행 하고 싶을 때라도 기본 vitualenv 환경에서 구성하고 실행 하는게 좋겠죠.

 

패키지구조)

ㄴ hello_world.py
ㄴ requirements.txt
ㄴ venv_wrapper.sh

 

venv_wrapper.sh)

python3 -m venv venv
. venv/bin/activate
pip3 install -r requirements.txt
python3 hello_world.py

 

이런 방식이 싫다면 도커 기반으로 구성을 해도 좋습니다.

:

[Groovy] Jenkins Pipeline Job 생성 시 bash 사용

ITWeb/개발일반 2022. 11. 1. 09:16

jenkins pipeline job 을 생성하고 groovy 스크립트 내부에서 일반 shell script 를 사용 할 때가 있습니다.

보통 아래와 같이 많이 사용 하는데요.

sh '''
echo "Hello World!"
'''

bash 를 지정해서 사용 하고자 할 때는 아래와 같이 적용을 해줘야 합니다.

sh '''#!/bin/bash
echo "Hello Bash!!"
'''

여기서 사용 시 주의사항은 #!/bin/bash 를 ''' 에 붙혀서 작성을 해줘야 합니다.

 

 

:

[Shell Script] bash script background run

ITWeb/개발일반 2022. 8. 17. 19:21
$ bash run.sh 1>/dev/null 2>&1 &

$ bash run.sh >/dev/null 2>&1 & echo $! > run.pid

background 실행 및 pid 활용.

 

:

[Shell] Bash String Split - tr

ITWeb/개발일반 2022. 5. 24. 12:38

쉘 스크립트 내부에서 문자열을 구분자를 이용해서 분해 하는 방법입니다.

IFS, read 를 이용해서 하는 방법도 있으니 찾아 보시면 되겠습니다.

 

여기서는 tr 을 이용해서 하는 방법에 대해서 가볍게 작성 합니다.

TARGET="1,2,3,4,5"
targets=($(echo $TAGET | tr "," "\n"))
targetSize=${#targets[@]}

for i in "${targets[@]}"
do
  echo $i
done

코드에서 가끔 실수 하는 부분은 

- ($(echo $TARGET | tr "," "\n")) 에서  괄호가 두 번 사용 된다는 건데 가끔 제일 앞에 괄호를 잊고 사용 할 때가 있습니다.

 

:

[Thymeleaf] 간만에 FE 작업 삽질 기록

ITWeb/개발일반 2022. 4. 22. 14:31

1. bootstrap UI 에서 "dropdown require Popper" 관련 오류가 발생을 하면 아래 내용을 추가 합니다.

 

[webjars + bootstrap 4 사용 시]

build.gradle)
implementation "org.webjars:popper.js:1.6.1-lts"

fragments_jsimport.html)
<!-- jQuery 먼저 선언 합니다. -->
<script type="text/javascript" th:src="@{/webjars/popper.js/umd/popper.min.js}"></script>
<!-- Bootstrap 을 나중에 선언 합니다. -->

여기서는 선언 순서를 지켜 주셔야 합니다.

 

2. spring mvc 에서 thymeleaf 로 값 전달

Controller)
mav.addObject("key", 1);

Thymeleaf)
<a th:href="@{/goto/{id}(id=${key})}">KEY</a>
To
<a href="/goto/1">KEY</a>

 

:

[Springboot+Ajax] 데이터 통신

ITWeb/개발일반 2022. 4. 7. 15:43

Spring Domain, VO, Model

@Setter
@Getter
@ToString
public class SearchRequestModel {

    private PageModel pageModel;
    private long id;
}

@Setter
@Getter
@ToString
public class PagetModel {

    private int page;
    private int size;
    private String sort;
}

 

Spring RestController

@ResponseBody
@RequestMapping(
    value = "/api/search",
    method = RequestMethod.POST,
    produces = { MediaType.APPLICATION_JSON_VALUE }
)
public String search(
	@RequestBody SearchRequestModel m
) {
	return service.search(m)
}

 

Ajax

$.ajax({
    type: "POST",
    url: "/api/search",
    dataType: "json",
    contentType: "application/json",
    data: JSON.stringify({
        "pageModel": {
            "page": 1,
            "size": 20,
            "sort": "asc"
        },
        "id": 1
    }),
    success: function(res) {
    },
    error: function(res, status, e) {
    }
});

 

Ajax 요청 시 dataType, contentType 선언 없이 + @RequestBody 선언 없이 사용할 경우,

일반적인 POJO 스타일의 Data Binding 으로 처리가 됩니다. (Spring 에서는 자동으로 처리가 됩니다.)

또는

@RequestParam 을 이용해서 값을 전달 받을 수 있습니다.

 

오랜만에 화면 작업 하다 보니 이런것도 기억이 가물 가물 합니다.

:

[Docker] Spring Boot App 도커 적용

ITWeb/개발일반 2022. 3. 23. 10:49

Springboot 로 WAS 생성 후 이를 도커 기반으로 생성, 실행 하기 위해서 관련 내용 기록 합니다.

 

관련 문서)

https://spring.io/guides/gs/spring-boot-docker/
https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/

 

과정)

1. 프로젝트를 빌드 해서 bootJar 를 생성 합니다.

보통 build/libs 에 생성이 됩니다.

 

2. Dockerfile 을 생성 합니다.

여기서 bootJar 를 ADD 해야 하는데 Dockerfile 과 같은 Depth 에 위치 하거나 하위에 위치해야 합니다.

상위에 bootJar 가 있을 경우 permission denied 에러가 발생 합니다.

 

3. Image 생성을 합니다.

$ docker build -t 이미지명:태그 .

태그 정보는 jenkins 에서 build number 를 부여 하거나 운영 규칙을 정해서 관리 합니다.

registry 를 운영하고 있으면 생성된 이미지를 등록 합니다.

 

4. docker-compose.yml 을 생성 합니다.

registry 를 운영하고 있으면 registry 에서 이미지를 받아 옵니다.

 

관련 예제 코드들은 위 문서에 잘 나와 있으니 참고 하면 됩니다.

 

아래는 그냥 참고용으로 올려 봅니다.

build.gradle)
...중략...
bootJar {
  destinationDirectory=file('docker/libs')
  enabled = true
}
...중략...

$ export TAG=1.0.0
$ docker build -t boot-app:$TAG .


Case 1) docker/Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Case 2) docker/Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT java \
-jar app.jar

Case 3) docker/Dockerfile
ENV heapSize="-Xms2048 -Xmx2048m"
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","${heapSize}","-jar","/app.jar"]

Case 4) docker/Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT java \
${heapSize} \
-jar app.jar

ENTRYPOINT 추가 옵션)
-Djava.security.egd=file:/dev/./urandom \
-Dspring.profiles.active=local


docker-compose) docker/docker-compose.yml
version: '3.7'

services:
  boot-app:
    container_name: boot-app
    image: boot-app:${TAG}
    environment:
      - TZ=Asia/Seoul
      - env=local
      - "heapSize=-Xms2048m -Xmx2048m"
    ports:
      - "8080:8080"
    volumes:
      - ./logs:/home/appuser/logs
    sysctls:
      - net.core.somaxconn=65000
    restart: on-failure

 

:

[Logback] JsonLayout, PatternLayout

ITWeb/개발일반 2022. 3. 16. 15:52
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>
  
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/file.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logs/file-%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>

    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>
  
  ...중략...
  
  </configuration>

필요한 부분에 대해서만 기록해 봅니다. 

appender !!

 

:

[Java] Read Properties File.

ITWeb/개발일반 2022. 3. 16. 15:19

일반 Java Application 프로젝트에서 resources 폴더 아래 application.properties 같은 정보를 가져와야 할 때가 있습니다.

아래 처럼 사용 하시면 됩니다.

 

application.properties)

host=localhost
port=8888

 

MainApplication.java)

public void readProperties() {
    Properties prop = new Properties();
    
    try ( InputStream stream = MainApplication.class.getClassLoader().getResourceAsStream("application"
    +".properties")) {
    	prop.load(Stream);
    } catch (Exception e) {
    }
    
    try {
    	Resource resource = new ClassPathResource("application.properties");
        prop.load(resource.getInputStream());
    } catch (Exception e) {
    }
    
    System.out.println( prop.getProperty("host") );
    System.out.println( prop.getProperty("port") );
}

 

:

[Gradle] build.gradle 에서 maven insecure protocol 설정

ITWeb/개발일반 2022. 3. 15. 12:39

maven. uri 설정 시 https 가 아닌 http 를 사용 할 경우 gradle 7.x 에서는 아래 설정을 추가해 주면 됩니다.

 

repositories {
	mavenCentral()
    
    maven {
    	url = uri("http://nexus.xxxxx.com/repository/snapshots")
        allowInsecureProtocol = true
    }
    
    maven {
    	url = uri("http://nexus.xxxxx.com/repository/public")
        allowInsecureProtocol = true
    }
}

 

: