데이터분석 자격검정 공인자격 제2018-01호  

제31회 데이터분석 준전문가(ADsP) 시험을 접수했습니다.

 

데이터자격검정 홈페이지에서 접수합니다. 

 

데이터자격시험

카드결제/계좌이체 환불 환불 요청시 즉시환불

www.dataq.or.kr

 

데이터분석 자격검정 31회차 데이터분석 준전문가 (ADsP) 일정은 다음과 같습니다. 

시험 접수기간 : ~ 10.18(월) 18:00 까지

시 험 일  : 2021.11.06(토)

 

시험은 필기 1차례 응시하면 합격이 가능합니다. 

과목은 데이터이해 / 데이터분석 기획 / 데이터분석으로 구성되어있습니다. 

 

문제는 총 50문제로 객관식 40문제, 단답형 10문제입니다. 모든 문제는 각 2점입니다. 

합격 조건은 아래와 같이 데이터이해 / 데이터분석 기획에서 각 4문제 이상, 데이터분석에서 12문제 이상 맞추어야 과락이 되지 않고, 총점 60점이상을 취득해야 합니다. 

 

접수기간은 10.12(화) 10:00 ~ 10.18(월) 18:00 이고, 접수 완료.

시험 공부 잘 준비해서 ADsP자격증을 취득해봅시다.

 

ADsP 자격증을 취득하면 ADP 자격증 필기 시험을 볼 수 있습니다

pom.xml

<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>4.25.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>4.25.0</version>
</dependency>

 

테이블 생성

CREATE TABLE shedlock ( name VARCHAR(64), lock_until TIMESTAMP(3) NULL, locked_at TIMESTAMP(3) NULL, locked_by VARCHAR(255), PRIMARY KEY (name) )

 

SchedulerConfiguration.java 생성 

package com.test.abc.cmmn.config;

import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class SchedulerConfiguration {
    @Bean
    public LockProvider lockProvider(DataSource dataSource) {
        return new JdbcTemplateLockProvider(dataSource);
    }
}

 

AbcApplication 파일에 @EnableSchedulerLock(defaultLockAtMostFor = "10m") 추가

package com.test.abc;

import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;


@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "10m")
public class AbcApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(AbcApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(AbcApplication.class);
    }
    
}

 

TaskController
@SchedulerLock(name = "scheduledTaskName", lockAtMostFor = "14m", lockAtLeastFor = "14m")

@Scheduled(cron="0 */1 * * * *") 
@SchedulerLock(name = "scheduledTaskName", lockAtMostFor = "14m", lockAtLeastFor = "14m")
public void Schedule1() throws Exception {
   
   ( 스케줄러 내용 ...)
   
}

 

정상동작하게 되면 아래처럼 DB에 생성된 shedlock 테이블에 데이터가 들어갑니다. 

 

'개발자 > spring' 카테고리의 다른 글

XSS JSON  (0) 2021.06.16
spring lucy XSS 적용하기  (0) 2021.06.16
    @Override
    public Page<vo> findApiApplyList(Pageable pageable){
        QVO vo = QVO.vo;
        QVoTmp voTmp= QVoTmp.voTmp;

        JPQLQuery<vo> query = from(vo)
                .select(Projections.fields(vo.class,
                        vo.column1,
                        vo.column2,
                        vo.column3,
                        vo.column4,
                        vo.column5,
                        ExpressionUtils.as(JPAExpressions.select(voTmp.[voTmp에서가져오려는컬럼명])
                        .from(voTmp)
                        .where(voTmp.[voTmp와vo를비교할컬럼명].eq(vo.[voTmp와vo를비교할컬럼명]))
                        , "[alias명]")))
                .orderBy(vo.[정렬할컬럼명].desc());

        return new PageImpl<>(
                getQuerydsl().applyPagination(pageable, query).fetch()
                , pageable
                , query.fetchCount()
        );
    }

 

JPA, QueryDsl로 개발을 하려고 하니 오랜만에 vo(entity .. ) 를 계속 수정해줘야 해서 너무 번거롭다.
하나 작성해놓으면 속도는 금방 붙는 거 같은데, 아직은 쿼리문 하나 쓸 때마다 검색해야 된다.

그래도 이 시간을 통해 배우는 게 있다는 생각이 드니까 재밌다는 생각도 든다.

'개발자 > JPA' 카테고리의 다른 글

[JPA/QueryDsl] insert into select  (0) 2021.08.12

JPA 로 개발을 처음 해보는데 개발하는 시간보다 검색하는 시간이 더 많이 드는 것 같다. 

검색을 한참하다가 JPA에서 insert into select 를 지원하지 않는다는 글을 보고 너무 허망했다.
더 알아보기를 포기하고 그냥 쿼리를 작성해서 처리했다.

    # Controller 
    public String insertIntoSelect()throws Exception{
       // 로그
       service.insertIntoSelect(idx);
    }
    
    #Service
    public class Service {
       @Autowired
        private Repository repository;

        public void insertIntoSelect(Long idx) throws Exception{
            repository.insertIntoSelect(idx);
        }
    }
    
    #Repository
    @Repository
    public interface Repository extends JpaRepository<vo, Long> {
        @Transactional
        @Modifying
        @Query(value = "insert into table_nm1 ([컬럼명]) " +
                "select [컬럼명] from table_nm2 where table_nm2.idx = :idx", nativeQuery = true)
        void insertIntoSelect(@Param("idx") Long idx);
    }

 

'개발자 > JPA' 카테고리의 다른 글

[JPA/QueryDsl] select문에서 subQuery 사용하기  (0) 2021.08.12

 

리눅스마스터 2급 시험을 봤습니다~
리눅스마스터 2급은 1차/2차로 진행됩니다.

2급 1차 필기는 온라인으로 진행되고 있습니다.

https://www.ihd.or.kr/main.do

 

KAIT 자격검정

시험접수 정보통신 자격검정 시험 원서등록을 하실 수 있습니다

www.ihd.or.kr

 

리눅스마스터 2급의 시험 접수 일정은 아래와 같습니다.
1차 : 07.26.(월) ~ 08.04.(수)
2차 : 07.27.(화) ~ 08.06.(금)

1차 시험은 온라인으로 진행되며, 07.27.(화) ~ 08.05.(목) 안에 진행되고,
시험접수 후 다음날 13시 이후에 시험응시가 가능합니다.
 2차 시험 일정은
09.11.(토) 예정입니다.

 

 

리눅스마스터 2급을 급하게 준비하면서 1차는 온라인이기 때문에 여러 후기를 찾아보게되었는데
여러 블로그에 제공되어 있는 족보를 기반으로 시험응시가 가능했습니다.

50점 만점에 42점으로 합격!

족보만 꼼꼼히 확인해도 1차는 합격이 가능하네요~!

바로 2차 접수를 진행했습니다.

 

2차 합격하면 후기로 돌아올게요~

 

 

-

리눅스마스터 자격활용현황은 아래 링크에서 확인 가능합니다~

https://www.ihd.or.kr/introducesubject1.do

 

KAIT 자격검정

리눅스마스터 졸업인증 경동대학교(정보보안학과), 공주대학교(컴퓨터공학부), 광안대학교(정보보호학과), 국제대학교(컴퓨터정보통신과), 동덕여자대학교(컴퓨터공학과), 동서울대학교(네트

www.ihd.or.kr

 

자격활용현황

학점은행제 인정

종목명인정학점관련근거

리눅스마스터 1급: 14학점, 2급: 5학점 인정 (일반선택) 학점인정 등에 관한 법률 제7조

고등학교 신입생 입학 시 가점 (경기도 특성화고)

종목명관련근거

리눅스마스터 1급, 2급 고등학교 신입생 내신성적지침

고등학생 재학 중 취득 학교생활기록부 기재 인정

종목명관련근거

리눅스마스터 1급, 2급 초등교육법 제25조

육군 초급간부(부사관, 학사장교) 모집과정 가점

종목명관련근거

리눅스마스터 1급, 2급 육군부사관/공군 학사장교 모집공고

현역병입대상자 복무선정

종목명관련근거

리눅스마스터 1급, 2급 병무청
현역복무지원기준

자격활용처

종목내용활용처

리눅스마스터 졸업인증 경동대학교(정보보안학과), 공주대학교(컴퓨터공학부), 광안대학교(정보보호학과), 국제대학교(컴퓨터정보통신과), 동덕여자대학교(컴퓨터공학과), 동서울대학교(네트워크통신보안전공), 명지대학교(인터넷응용보안공학과), 방송통신대학교(컴퓨터과학과), 수원대학교(행정학과), 유원대학교(스마트IT학과), 전북대학교(컴퓨터공학부), 중부대학교(정보보호학과)
장학금 지급 가천대학교(컴퓨터공학과), 경기과학기술대학교(컴퓨터모바일융합과), 경기대학교(컴퓨터공학부), 경민대학교(정보통신과), 김포대학교(사이버보안학과), 동덕여자대학교(컴퓨터공학과), 동원대학교(컴퓨터정보과), 부천대학교(컴퓨터정보보안과), 상지대학교(컴퓨터공학과), 성결대학교(미디어소프트웨어학과), 성결대학교(컴퓨터공학부), 중부대학교(소프트웨어공학부)
인사고과 반영 ㈜KT, 네트웍오앤에스㈜, 신한데이터시스템, 에스큐브아이, 에프아이에스시스템㈜, 위니텍, ㈜애드캡슐소프트, ㈜엘에스씨시스템즈, ㈜파인원커뮤니케이션즈
역량개발 지원 동양미래대학교(컴퓨터소프트웨어공학과), 인하공업전문대학(컴퓨터공학과)
직무능력 지원 성우전자㈜, 에프아이에스시스템㈜, ㈜디케이테크인, ㈜에이텍티앤, ㈜윈스, ㈜케이아이엔엑스, ㈜티시스, 한기술
학점인정 건국대학교(컴퓨터공학과), 경동대학교(정보보안학과), 경인대학교(사이버보안), 광안대학교(정보보호학과), 동서울대학교(네트워크통신보안학과), 동양미래대학교(정보통신공학과), 명지대학교(인터넷응용보안공학과), 상명대학교(휴먼지능정보공학과), 서강대학교, 서일대학교(컴퓨터응용전자과), 성균관대학교(소프트웨어학과), 세명대학교(정보통신학부), 세종대학교(지능기전공학부), 신안산대학교(컴퓨터정보과), 신안산대학교(컴퓨터정보과), 유원대학교(정보통신보안), 인덕대학교(정보통신공학과), 중앙직업전문학교(드론학과)

 

[자격증] 정보보안기사 자격증(신청법/시험일정/시험장소/응시자격/시험내용)

정보보안기사의 경우,
큐넷이 아닌 KISQ(정보보안국가기술자격검정센터)에서 시험 신청을 합니다. 

https://kisq.or.kr/main/main.do

 

KISQ정보보안국가기술자격검정센터

KISQ정보보안국가기술자격검정센터

kisq.or.kr

 

-

응시장소는 검정지역 : 전국 5개지역(서울,부산,대전,대구,광주) 수검장으로 나오네요~
자세한 내용은 이번에 시험을 응시하면서 확인해 볼 수 있을 것 같아요!

정보보안기사의 경우, 필기/실기 2단계로 시험을 합격하여 취득이 가능합니다.
비용은 필기 18,800원 / 실기 21,900원 입니다.

-

시험 일정은 아래 링크에서 확인할 수 있는데요, 
https://kisq.or.kr/exam/examSchedule.do
2021년에는 8월 2일부터 필기 접수를 싲가하여 9월 4일 시험 일정이 있네요!
실기는 10월 30일! 열심히 준비해서 올해 안에 취득하고 싶네요(간절)

 

 

KISQ정보보안국가기술자격검정센터

KISQ정보보안국가기술자격검정센터

kisq.or.kr

 

-

응시자격은 아래 URL로 들어가시면 응시자격 자가진단이 가능합니다!

https://kisq.or.kr/apply/check.do

 

KISQ정보보안국가기술자격검정센터

KISQ정보보안국가기술자격검정센터

kisq.or.kr

 

-

이 페이지에서는 응시자격 조건을 확인할 수 있어요!https://kisq.or.kr/exam/examCondition.do

 

KISQ정보보안국가기술자격검정센터

KISQ정보보안국가기술자격검정센터

kisq.or.kr

 

기사의 경우, 

다음 각 호의 어느 하나에 해당하는 사람

  • 1.산업기사 등급 이상의 자격을 취득한 후 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 1년 이상 실무에 종사한 사람
  • 2. 기능사 자격을 취득한 후 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 3년 이상 실무에 종사한 사람
  • 3. 응시하려는 종목이 속하는 동일 및 유사 직무분야의 다른 종목의 기사 등급 이상의 자격을 취득한 사람
  • 4. 관련학과의 대학졸업자등 또는 그 졸업예정자
  • 5. 3년제 전문대학 관련학과 졸업자등으로서 졸업 후 응시하려는 종목이 속하는 동일 및 유사 직무 분야에서 1년 이상 실무에 종사한 사람
  • 6. 2년제 전문대학 관련학과 졸업자등으로서 졸업 후 응시하려는 종목이 속하는 동일 및 유사 직무 분야에서 2년 이상 실무에 종사한 사람
  • 7. 동일 및 유사 직무분야의 기사 수준 기술훈련과정 이수자 또는 그 이수예정자
  • 8. 동일 및 유사 직무분야의 산업기사 수준 기술훈련과정 이수자로서 이수 후 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 2년 이상 실무에 종사한 사람
  • 9. 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 4년 이상 실무에 종사한 사람
  • 10. 외국에서 동일한 종목에 해당하는 자격을 취득한 사람

 

 

 

산업기사의 경우,

다음 각 호의 어느 하나에 해당하는 사람

  • 1. 기능사 등급 이상의 자격을 취득한 후 응시하려는 종목이 속하는 동일 및 유사 직무분야에 1년 이상 실무에 종사한 사람
  • 2. 응시하려는 종목이 속하는 동일 및 유사 직무분야의 다른 종목의 산업기사 등급 이상의 자격을 취득한 사람
  • 3. 관련학과의 2년제 또는 3년제 전문대학졸업자등 또는 그 졸업예정자
  • 4. 관련학과의 대학졸업자등 또는 그 졸업예정자
  • 5. 동일 및 유사 직무분야의 산업기사 수준 기술훈련과정 이수자 또는 그 이수예정자
  • 6. 응시하려는 종목이 속하는 동일 및 유사 직무분야에서 2년 이상 실무에 종사한 사람
  • 7. 고용노동부령으로 정하는 기능경기대회 입상자
  • 8. 외국에서 동일한 종목에 해당하는 자격을 취득한 사람

 

-

시험 과목은 필기 - 시스템보안, 네트워크보안, 어플리케이션 보안, 정보보안 일반, 정보보안관리 및 법규 5과목으로 각 20문항씩 400점 만점입니다. 사지선다형입니다. 과목별 30분 시험을 보게 되네요 총 150분입니다.

실기 - 필답형으로 정보보안 실무를 보게 됩니다. 실기는 180분!

 

어려운 시험이라고 들어서 한 번에 합격할 거라고 생각은 못하지만
꾸준히 하다보면 합격하는 날도 올 것이라는 기대로 
매일 조금씩 열심히 해보려고 합니다

정보보안기사 시험 준비하시는 모두 화이팅입니다~

[~톰캣경로]/lib

java -cp catalina.jar org.apache.catalina.util.ServerInfo

버전 확인 완.

[자격증] SQLD 자격증 드디어 합격 - 2년 만기 자격증 영구 전환을 위한 보수교육 

SQLD 자격증을 드디어 취득했습니다.

처음 응시했던 건 첫 취준 때 자격증 하나라도 늘려보자 해서 응시했던 기억이 나네요

그 때가 23회 시험이었는데
중간에 한 번 더 신청했는데 시험 일정이 여의치 않아서 또 실패.
이번에 언제가 될지 모르는 이직을 위해 다시 응시했습니다.
41회 합격~

그렇게 어려운 시험도 아닌데 이렇게 15만원이나 주고 합격하다니ㅜㅜ
 저는 정보처리기사도 여러 번 떨어지고 최종합격 해가지고..
자격증시험을 잘 못 보나 싶기도 하고.. ㅎㅎ

 

-

자격증에 유효기간(2021.06.25~2023.06.25) 이 있어 FAQ를 찾아보니 아래와 같은 답변이 있었다.

https://www.dataq.or.kr/www/board/view.do

 

데이터자격시험

 

www.dataq.or.kr

 

보수교육은 마이페이지에 내용이 나오는 것 같다.

 1년 6개월 후에 다시 보수교육을 받아야겠다~

 

SQLD 시험 준비하시는 모두 화이팅입니다~

HtmlEscapingObjectMapperFactory.java 생성

package com.abc.cmmn.web;

import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.beans.factory.FactoryBean;
import com.fasterxml.jackson.core.SerializableString;
import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.io.SerializedString;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class HtmlEscapingObjectMapperFactory implements FactoryBean<ObjectMapper> {

	private final ObjectMapper objectMapper;

	public HtmlEscapingObjectMapperFactory() {
		objectMapper = new ObjectMapper();
		objectMapper.getFactory().setCharacterEscapes(new HTMLCharacterEscapes());
		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
	}

	@Override
	public ObjectMapper getObject() throws Exception {
		return objectMapper;
	}

	@Override
	public Class<?> getObjectType() {
		return ObjectMapper.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

	public static class HTMLCharacterEscapes extends CharacterEscapes {

		private static final long serialVersionUID = 1L;
		private final int[] asciiEscapes;

		public HTMLCharacterEscapes() {
			// start with set of characters known to require escaping (double-quote,
			// backslash etc)
			asciiEscapes = CharacterEscapes.standardAsciiEscapesForJSON();
			// and force escaping of a few others:
			asciiEscapes['<'] = CharacterEscapes.ESCAPE_CUSTOM;
			asciiEscapes['>'] = CharacterEscapes.ESCAPE_CUSTOM;
			asciiEscapes['&'] = CharacterEscapes.ESCAPE_CUSTOM;
			asciiEscapes['"'] = CharacterEscapes.ESCAPE_CUSTOM;
			asciiEscapes['\''] = CharacterEscapes.ESCAPE_CUSTOM;
		}

		@Override
		public int[] getEscapeCodesForAscii() {
			return asciiEscapes;
		}

		// and this for others; we don't need anything special here
		@Override
		public SerializableString getEscapeSequence(int ch) {
			return new SerializedString(StringEscapeUtils.escapeHtml4(Character.toString((char) ch)));
		}
	}
}

 

dispatcher-servlet.xml 에 bean 추가

 

<bean id="htmlEscapingObjectMapper" class="com.abc.cmmn.web.HtmlEscapingObjectMapperFactory" />
	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean
				class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="objectMapper"
					ref="htmlEscapingObjectMapper"></property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

 

pom.xml

		<dependency>
			<groupId>com.navercorp.lucy</groupId>
			<artifactId>lucy-xss-servlet</artifactId>
			<version>2.0.0</version>
		</dependency>

 

/resources 하위에 lucy-xss-servlet-filter-rule.xml 생성

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.navercorp.com/lucy-xss-servlet">
   <defenders>
       <!-- XssPreventer 등록 -->
       <defender>
           <name>xssPreventerDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssPreventerDefender</class>
       </defender>
 
       <!-- XssSaxFilter 등록 -->
       <defender>
           <name>xssSaxFilterDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssSaxFilterDefender</class>
           <init-param>
               <param-value>lucy-xss-sax.xml</param-value>   <!-- lucy-xss-filter의 sax용 설정파일 -->
               <param-value>false</param-value>        <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
           </init-param>
       </defender>
 
       <!-- XssFilter 등록 -->
       <defender>
           <name>xssFilterDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssFilterDefender</class>
           <init-param>
               <param-value>lucy-xss.xml</param-value>    <!-- lucy-xss-filter의 dom용 설정파일 -->
               <param-value>false</param-value>         <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
           </init-param>
       </defender>
   </defenders>
 
    <!-- default defender 선언, 별다른 defender 선언이 없으면 default defender를 사용해 필터링 한다. -->
    <default>
        <defender>xssPreventerDefender</defender>
    </default>
 
    <!-- global 필터링 룰 선언 -->
    <global>
        <!-- 모든 url에서 들어오는 globalParameter 파라메터는 필터링 되지 않으며 
                또한 globalPrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
        <params>
            <param name="globalParameter" useDefender="false" />
            <param name="globalPrefixParameter" usePrefix="true" useDefender="false" />
        </params>
    </global>
 
    <!-- url 별 필터링 룰 선언 -->
    <url-rule-set>
       
       <!-- url disable이 true이면 지정한 url 내의 모든 파라메터는 필터링 되지 않는다. -->
       <url-rule>
           <url disable="true">/disableUrl1.do</url>
       </url-rule>
       
        <!-- url1 내의 url1Parameter는 필터링 되지 않으며 또한 url1PrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
        <!-- <url-rule>
            <url>[처리하는 url].do</url>
            <params>
                <param name="[파라미터명]" useDefender="false" />
            </params>
        </url-rule> -->
        
    </url-rule-set>
</config>

 

web.xml 에 encodingFilter 항목을 찾아서

 <filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <url-pattern>*.do</url-pattern> 
  </filter-mapping>

다음에 추가해줌.

    <filter>
		<filter-name>multipartFilter</filter-name>
		<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>multipartFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter> 
		<filter-name>xssEscapeServletFilter</filter-name> 
		<filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class> 
	</filter> 
	<filter-mapping> 
		<filter-name>xssEscapeServletFilter</filter-name> 
		<url-pattern>/*</url-pattern> 
	</filter-mapping>
  <filter>

 

tomcat 서버에서 server.xml 에  allowCasualMultipartParsing="true" 를 추가해줌.

 <Context docBase="ProjectName" path="/" allowCasualMultipartParsing="true" reloadable="true" source="org.eclipse.jst.jee.server:ProjectName"/></Host>

 

tomcat 서버 context.xml 에 추가하는 방식도 있다고 함.

<Context allowCasualMultipartParsing="true">
<Context allowCasualMultipartParsing="true" path="/">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>			
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>	
</Context>​

서버 재시작.

잘 안되서 프로젝트 클린 - 톰캣 클린 - 이클립스 재시작 하니까 됐다.

'개발자 > spring' 카테고리의 다른 글

[spring boot] SchedulerLock - 톰캣 스케줄러 중복 동작 방지  (0) 2021.08.26
XSS JSON  (0) 2021.06.16

oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');"

String -> Date포맷

<span th:text="${#temporals.format(result.regDt, 'yyyy-MM-dd HH:mm')}"></span>

Date -> Date포맷

<span th:text="${#dates.format(result.regDt, 'yyyy-MM-dd')}"></span>

텍스트 대치 하다가 to, name 으로 한국어가 들어갔을 때 UTF-8로 인코딩 되지 않아 오류가 발생한 경우입니다. 

{ 
	"to": ["example@example.com", "example@example.com"]
	, "sub": {
		"%name%": ["테스트", "테테"] 
	} 
}

A message was received from this address by our systems that had errors in the SMTPAPI header, and cannot be processed due to the following:

 - invalid JSON

If you require assistance in working with the SendGrid API, please contact us at support@sendgrid.com

 


아래 구문으로 encodeText 처리하여 넘겨주면 정상적으로 메일 발송 성공을 확인할 수 있습니다.

message.addHeader("X-SMTPAPI", MimeUtility.encodeText(smtpJson));


Multipart multipart = new MimeMultipart("alternative");
BodyPart part = new MimeBodyPart();
message.addHeader("X-SMTPAPI", MimeUtility.encodeText(smtpJson));
part.setContent(content, "text/html; charset=utf-8");
multipart.addBodyPart(part);
message.setContent(multipart);

 

 

 

SMTP를 이용해 다량 메일을 보는 경우 발송 메일 html 내 건별 텍스트 대치를 하고 싶었습니다. 

회원별 이름이나 닉네임 등을 변경하여 OOO님 이런 식으로 보내고 싶었어요-

Sendgrid 에서 Customizing your send 라는 걸 지원하더라구요-

 

{
  "to": ["example@example.com", "example@example.com"],
  "sub": {
    "%name%": ["Ben", "Joe"]
  }
}

 

JSON 방식으로 위 값처럼 만들어서 보내주면 됩니다~ 

아래 방식으로 JSONObject에 담아 String으로 변환하여 보내줍니다.

List<Map> rstList = [DB에서 받아온 데이터];
List<String> to = new ArrayList<String>(); // 받는사람 email
List<String> name = new ArrayList<String>(); // 받는사람 닉네임

for (Map map: rstList) {
    if(map.get("e-mail") != null && map.get("name") != null) { // 두 값 모두 필수 이기 때문에 if문 추가
        to.add(map.get("email").toString());
        name.add(map.get("name").toString());
    }
}

JSONObject json = new JSONObject();
JSONObject jsonSub = new JSONObject();
json.put("to", to);
jsonSub.put("%name%", name);
json.put("sub", jsonSub);

String jsonRst = json.toString();

 

헤더에 전달하는 방법 : message.addHeader("X-SMTPAPI", jsonRst);

Multipart multipart = new MimeMultipart("alternative");
BodyPart part = new MimeBodyPart();
message.addHeader("X-SMTPAPI", jsonRst);
part.setContent(content, "text/html; charset=utf-8");
multipart.addBodyPart(part);
message.setContent(multipart);

 

 

SMTP 를 이용한 발송은 아래 페이지를 참고해서 작성했습니다.

https://docs.microsoft.com/ko-kr/azure/store-sendgrid-java-how-to-send-email#how-to-use-the-javaxmail-libraries

 

SendGrid 메일 서비스를 사용하는 방법(Java)

Azure에서 SendGrid 메일 서비스를 사용하여 메일을 보내는 방법을 알아봅니다. 코드 샘플은 Java로 작성되었습니다.

docs.microsoft.com

 

 

 

 

 

https://sendgrid.com/docs/for-developers/sending-email/building-an-x-smtpapi-header/#customizing-your-send-filters

 

Building an X-SMTPAPI Header

Learn how to build email content, add recipients and schedule your send.

sendgrid.com

 

 

인텔리제이에서 Sendgrid 메일 발송 테스트 진행 중 한글 깨짐 관련 오류가 발생하여

발송인 메일로 다음과 같은 오류 메일이 왔습니다. 


A message was received from this address by our systems that had errors in the SMTPAPI header, and cannot be processed due to the following:

 - unknown charset 'ms949'

If you require assistance in working with the SendGrid API, please contact us at support@sendgrid.com

 

확인해보니 인텔리제이에서 컴파일이 UTF-8로 되지 않아서 발생하는 현상이었습니다.

help - Edit Custom VM Options.. 를 열어서

 

아래 문구를 추가하고 인텔리제이 재시작~

-Dfile.encoding=UTF-8

 

안 되면 .. 다시 Setting-Editor-File Encodings에서 UTF-8로 설정..

 

그래도 안 되면.. 상단 설정에 Edit Configurations.. 들어가서

 

저는 이걸 다 하고.. 해결되었습니다ㅎㅎ



+ Recent posts