반응형

스프링부트에서 JavamailSender사용시 sendMail부분에서 다음과 같은 에러가 발생

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.NoSuchProviderException: No provider for SMTP. Failed messages: javax.mail.NoSuchProviderException: No provider for SMTP at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:446) ~[spring-context-support-5.1.2.RELEASE.jar!/:5.1.2.RELEASE] at
.
.
.
Caused by: javax.mail.NoSuchProviderException: No provider for SMTP
at javax.mail.Session.getProvider(Session.java:545) ~[javax.mail-1.6.2.jar!/:1.6.2] at 
.
.

 

소스코드

    @Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setProtocol("SMTP");
        javaMailSender.setHost("127.0.0.1");
        javaMailSender.setPort(25);

        return javaMailSender;
    }

문제의 원인은 javaMailSender.setProtocol("SMTP"); 이부분이였다.

setProtocol의 "SMTP"를 "smtp" 소문자로 변경해주면 해결된다.

해결책

"SMTP" => "smtp"

이유

JavaMailSenderImpl 파일을 들어가보면 알 수 있다. 내부에 DEFAULT_PROTOCOL 이 소문자로 할당되어있다.

public class JavaMailSenderImpl implements JavaMailSender {
    public static final String DEFAULT_PROTOCOL = "smtp";
    

항상 문제가 발생했을 때 문제 해결에 그치지 말고 이유에 대해서도 꼭 짚고 넘어가도록 하자!!!!

문제 해결보다 중요한게 원인 파악 이라고 생각한다.

반응형
반응형

스프링부트에서 메일 발송 기능 구현 중 다음과 같은 에러가 발생하였다.

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mailService': Unsatisfied dependency expressed through field 'javaMailSender'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] 
.
.
.
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1646) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1205) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1166) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]

 

소스코드

기본적인 maven dependency추가 후 @Autowired했음

 

문제해결

@Bean으로 다음과 같이 protocol, host, port 지정 해줌

    @Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setProtocol("smtp");
        javaMailSender.setHost("127.0.0.1");
        javaMailSender.setPort(25);

        return javaMailSender;
    }
반응형
반응형

스프링부트 with JPA 프로젝트 작업중 신기한게 로컬환경에서는 에러가 안났는데 alpha, real환경에만 배포하면 위와 같은 에러 메세지가 나왔다....

Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Either use @Param on all parameters except Pageable and Sort typed once, or none at all!

문제의 원인이 무었이었는고 하니...

JPA 에서 매개변수 2개를 받는 메서드에 한 변수에만 @Param을 지정해서 사용하여서 발생하였다...

jobId 매개변수에도 @Param을 명시적으로 주니 정상적으로 해결 되었다.

void upsertAnalysisData(@Param("jobId") int jobId, @Param("audience") AudienceAnalysis audienceAnalysis);

혹시나 비슷한 에러가 발생한다면 JPA Repository부분에 특정 매개변수에만 @Param을 주어서 사용하진 않았는지 확인해보자!

반응형
반응형

보통 impala(임팔라)에서 임시 테이블을 생성 후 해당 테이블의 데이터를 기존 Imala의 데이터와 Join(조인)해서 사용해야 할 경우 다음과 같이 테이블을 생성 후 해당 경로에 데이터를 밀어넣어 준다.

create table DBNAME.TABLENAME (uid STRING) row format delimited fields terminated by ' ' LOCATION "hdfs:///user/hive/warehouse/특정원하는디렉토리명칭/“;

문제는 해당 명령어로 TABLE을 만들고 Imapa shell상에서 drop table [테이블명] 을 하였을 때 LOCATION으로 지정된 HDFS 파일은 남아 있게 되고 hadoop 명령어로 따로 지우려고 하면 보통 Hadoop 명령어 실행 권한과 해당 경로에 파일을 쓴 권한 [Impala] 가 달라서 Permission denied되며 삭제 되지 않는다.

따라서 해당 테이블을 Impala 테이블에서 Drop시키면서 연결괸 HDFS File도 함께 삭제 하고 싶다면 'PURGE' 옵션을 함께 주자.

drop table [tablename] PURGE

이렇게 하면 한 방에 해결할 수 있다.

반응형
반응형

nginx의 access log가 두 번이나 씌여지는 현상을 발견하여 포스팅 해본다.

location = '/getid'
{
     if ($scheme !~* "https") {
            return 308 https://$host$request_uri;
     } 
    access_log /home1/irteam/dmp_log_collector/nginx/logs/dmp_applog.${hostname} appmlog;
}

위와 같이 request의 scheme이 'http'가 아닌 경우 'https'로 리다이렉트 하도록 되어져 있다.

따라서 http로 요청을 하였을 때는 당연히 acces_log를 안찍을 거라고 생각을 했는데....아니였다.....

nginx는 기본적으로 요청이 들어왔을 때 현재의 스코프내에서 정의되어져 있는 access_log가 있다면 해당 경로에 access log를 남기고 그렇지 않다면 그 상위 스코프에 있는 access_log에 접근해 access log를 남긴다는 것이다. 자바스크립트의 hoisting(호이스팅)과 비슷한 느낌이다.

따라서 'http'요청일 경우 access log를 남기고 싶지 않다면 if 블럭에 'access_log off'를 주어 access log를 남기지 않도록 한다.

location = '/getid' 

     if ($scheme !~* "https") { 
            access_log off;
            return 308 https://$host$request_uri; 
     }
     access_log /home1/irteam/dmp_log_collector/nginx/logs/dmp_applog.${hostname} appmlog;
}

 

자세한 내용은 nginx의 documentation을 참고하자.

Similar to the  error_log directive, the access_log directive defined on a particular configuration level overrides the settings from the previous levels. When processing of a request is completed, the message is written to the log that is configured on the current level, or inherited from the previous levels. If one level defines multiple access logs, the message is written to all of them.

https://docs.nginx.com/nginx/admin-guide/monitoring/logging/

 

NGINX Docs | Configuring Logging

Capture detailed information about errors and request processing in log files, either locally or via syslog.

docs.nginx.com

 

반응형
반응형
Cookie cookie = new Cookie("", "");
response.addCookie(cookie);

쿠키 생성시 위와 같이 name에 빈 값을 넣어 굽게 되면 다음과 같은 에러가 발생한다.

java.lang.IllegalArgumentException: Cookie name may not be null or zero length

고로 쿠키 네임에는 null이나 length가 0인 값이 들어 갈 수 없다!

반응형
반응형

아파치 톰캣 연동 작업을 위해 필요한 톰캣 커넥터(Tomcat connector) 설치 작업 중 다음과 같은 에러가 발생했다.

톰캣 커넥터를 다운받고 tar로 압축을 푼 후 해당 폴더의 native폴더에 들어가 다음의 MakeFile을 만들기 위해 명령어를 실행

./configure --with-apxs=/usr/bin/apxs

다음과 같은 에러 발생

configure: error: in `/usr/local/src/tomcat-connectors-1.2.48-src/native':
configure: error: C compiler cannot create executables

mod_jk를 설치 하려면 gcc, gcc-c++, httpd-devel 세가지 패키지가 설치되어 있어야 한다.

다음과 같이 설치해주고 다시 실행

yum install gcc gcc-c++ httpd-devel

좀 더 자세한 설명이 필요하다면 아래의 포스팅을 확인바랍니다.

https://cionman.tistory.com/26

 

09. 리눅스(CentOS) 개발 놀이터 만들기 - Apache와 Tomcat 연동

블로그가 이전 작업 중에 있습니다.아래의 링크를 클릭하시면 동일한 내용을 보실 수 있습니다. https://suwoni-codelab.com/linux/2017/05/29/Linux-CentOS-Apache-Tomcat/ 안녕하세요~ Apache와 Tomcat의 연동..

cionman.tistory.com

 

반응형
반응형

jar로 작업된 스파크 프로젝트를 spark-submit 실행시 아래와 같은 에러가 발생했다.

RejectedExecutionException은 첨 겪어봐서 당황했지만....문제의 원인은 단순했다.

java.util.concurrent.RejectedExecutionException: Task org.apache.spark.scheduler.TaskResultGetter$$anon$2@ab4016a rejected from java.util.concurrent.ThreadPoolExecutor@9c5a328[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 603]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)

at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)

프로젝트 빌드시 spark driver셋팅을 잘못해준것...

trait InitSpark {
  // for local
//  val sparkConf = new SparkConf().setAppName("Spark-1.6.x-sample").setMaster("local[*]").set("spark.driver.host", "localhost");
  // for build
  val sparkConf = new SparkConf().setAppName("Spark-1.6.x-sample")
  val sc = new SparkContext(sparkConf)
  val sqlContext = new HiveContext(sc)
}

로컬모드 (setMaster("local[*]").set("spark.driver.host", "localhost") 로 빌드하고 돌려서 문제가 되었다...

보통은 작업한 스파크 버전과 spark-submit을 실행하는 환경의 스파크 버전이 달라도 발생하는 에러메세지라고 한다.

반응형
반응형

2020년이 시작하고 1월 토이프로젝트에 설까지 너무 빨리지나가버렸다. 그렇게 1월 포스팅 하나 하지 못한 채 2월을 맞이하게 되었다. 너무빨리지나가는 시간이 무섭기도 하고 1월 한달간 포스팅하나 제대로 못한 것이 맘에 꽤나 걸렸다.

그 순간 문득 2월은 한 달간 1일 1포스팅을 해보면 어떨까? 하는 생각이 들었다. 생각이 한 번들자 실제로 실천했을 때 1월과 방문자수는 얼마나 차이가 날지도 궁금했고 2월은 짧으니까! 할 수 있겠다라는 자신감이 들었다. 그런데 4년에 한 번 돌아오는 윤달인지는 알지 못했고...2월 29일인 지금 이렇게 마지막 포스팅을 남기고 있다^^ 

처음 호기롭게 시작하고 약 10일 간은 굉장히 수월했던 것 같다. 기존에 생각만하고 포스팅하지 못했던 주제들에 하나 두개씩 글을 써나가기 시작했고 전에 소재들에 대해 생각해논 덕분에 10일까지는 별어려움없이 진행되었다. 문제는 그 이후 부터였다. 보통 개발을 하다가 특정 문제에 부딪혔을 때 그 문제들을 해결해나가며 몰랐던 부분에 대해 포스팅하거나 경험해보지 못했던 이슈트래킹을 한 경우에 대해서 포스팅을 했었는데 이제 나도 어연 개발자로 일한지 6년차로 접어들었고 왠만한 문제는 한 번씩은 겪어보았던 탓에 주기가 그렇게 짧지가 않았다. 그렇기에 연달아 10일을 포스팅하고 나니 소재가 다 떨어져 내가 이 도전과제를 잘 끝까지 마무리할 수 있을까하는 생각이 들었다.

그렇게 10일 이후 소재가떨어지기 시작하며 기존에 사놓았지만 보진 못했던 책들을 하나 둘 펼치게 된다. 모르는 내용이나 쉽게 지나쳤던 내용들 중 알아두면 좋을 만한 내용들을 찾기 시작했다. 물론 포스팅을 위해서였다. 이러다보니 뭔가 주객전도가 된듯한 느낌을 받았다. 그래도 어떻게 좋은 내용들을 발췌해 포스팅을 해나가며 시간은 어느덧 20일을 향해 나아가고 있었고 이제 얼마안남았다는 생각이 들었다. 

15일 정도 꾸준히 포스팅을 하다보니 반 이상왔다는 생각에 더더욱 꼭 한 달간 1일 1포스팅 도전을 성공적으로 마무리짓고 싶었다. 그래서 약속이 있는 날이나 바쁠 것 같은 날에는 그 전날 미리 포스팅을 하여 예약을 걸어놓기도 하였다. 그렇게 성공적으로 1일 1포스팅 목적을 달성을 코앞에 두고 있고 마지막 포스팅을 작성해 나가고 있다.

2월 한 달간 1일 1포스팅을 하며 느낀점은 다음과 같다. 생각보다 나는 생각만하고 행동으로 빠릿빠릿하게 하는 타입은 아니였다는걸 깨달았다. 포스팅해야지 하고 항상 소재만 생각해놓고 미뤄놓았던 이전의 내 모습들을 보며 느꼈고 항상 하루의 막바지즈음에나 급하게 포스팅을 하는 나의 모습을 보면서도 느꼈다. 요즘드는 생각이지만 시간을 좀 더 효율적으로 보내는 노력을 더 해야 할 것 같다. 그리고 1일 1포스팅의 취지는 좋았지만 내게는 맞지 않는 방식이라는 생각이 들었다. 물론 포스팅을 하는 과정에서 조금이라도 더 전공책을 보려하고 전공지식의 포스팅들을 보며 공부하는 시간은 늘었지만 심리적인 압밥감과 스트레스로 다른 내가 하고 있는 것들에 대해 어느정도 영향이 미쳤던 것 같다. 하지만 꼭 한 번은 해보고 싶은 도전이였고 이렇게 성공적으로 마칠 수 있어 너무 행복하다. 이제 2020년 남은 날들은 좀 더 심도있는 글들을 남겨나가고 싶다. 너무 목표 성취만을 위해 성의 없는 포스팅을 하기도 했었다. 그 당시 나에게는 그 하루로 인해 1달 목표를 망치기 보다 일단 포스팅을 함으로써 내 도전과제를 이어나가고 싶은 욕심이 더 컸었기 때문이다. 하루는 3분 남기고 포스팅을 완료짓기도 했다ㅎㅎ

그럼 한 달 동안 1일 1포스팅을 하며 방문자수는 얼마나 차이가 났을까? 

전 달(1월)과 비교했을 때는 4천 이상 방문수가 차이가 났고 2019년과 2018년에 비해서는 1만 이상의 차이를 보였다ㅎㅎ이렇게 보니 성장해나가고 있다는 생각에 기분이 좋다. 글을 쓰는 만큼 조금씩 방문해주는 사람도 늘어나고 있고 그걸 수치가 증명해주고 있어 잘해나가고 있다는 생각이 든다. 

항상 생각한다. 나는 머리가 똑똑하지도 않고 게으름도 많은 편이지만 항상 내가 생각하고 계획했던 것들을 꾸준히 해나가는 성실함이 큰 무기인 것 같다. 앞으로도 이 성실한 모습을 바탕으로 다양한 것들에 많이 도전해보고 실천해 나가고 싶다. 조금더 부지런해질 필요가 있고 주어진 시간에 대해 좀 더 효율적으로 쓸 수 있도록 노력하자!!!!

2월 한 달 너무 뿌듯하고 스스로에게 자랑스러운 큰 추억이 될 만한 한 달이였다!

반응형

+ Recent posts