[쉽게 따라하는 자바 웹 개발] AS 1. 메이븐 관련 이슈 정리

(전체 화면에 720hd 화질 선택하시면 코드까지 잘 보이실 겁니다.)

첫번째 애프터 서비스로 프로젝트 import시 발생하는 메이븐 관련 이슈 원인과 그 해결책을 설명한 동영상을 올렸습니다.

먼저, 메이븐 의존성을 제대로 못가져오는 문제인데요. 이 문제로 두분이 봄싹 그룹스에 질문을 올려주셨습니다.

jkee님: https://groups.google.com/forum/?fromgroups=#!topic/springsprout/KMkA8iGUtkQ

chicken-hit님: https://groups.google.com/forum/?fromgroups=#!topic/springsprout/EmBvNPe3nUY

이 두분은 프로젝트를 import 하고나서 메이븐 프로젝트를 빌드하는 과정 중에 Update Maven Dependencies라는 과정이 있는데.. 그 때 필요한 의존성을 받아오다가.. 네트워크 상황이 안좋거나, 메이븐 중앙 저장소가 바쁘거나해서.. 필요로하는 의존성을 못가져온 경우입니다.

이때 의존성을 못가져오는 경우가 두가지가 있는데..

  • 완전히 jar 파일 자체를 못가져온 경우.
  • 또는 jar파일을 가져오다가 중간에 멈춘 경우.

첫 번째 경우라면 메이븐 의존성을 다시 업데이트 하도록 Maven -> Project Update(이전에는 Update Dependencies라는 메뉴가 있었는데 이걸로 대체되었나봅니다.)를 실행하면 받아오실 수 있는데요. 두번째 경우라면 그렇게 해도 다시 받아오지 않을수 있습니다. 따라서 그럴 떄는 로컬 메이븐 저장소(보통 유저 홈디렉토리/.m2/repository)에서 해당 의존성 디렉토리를 삭제하시고 다시 프로젝트 업데이트나 아에 프로젝트를 삭제하고 추가하면 메이븐 의존성을 제대로 받아올 수 있습니다만.. 백프로 확신을 못하는거죠. 그때 다시 받아올 때 또다시 네트워크 상황이 좋치 않거나, 메이븐 중앙 저장소가 바쁘면.. 같은 일이 재발할 수 있습니다.

그래서 최후의 수단으로는 로컬 메이븐 저장소에 직접 JAR 파일들을 경로에 맞춰서 넣어주시는건데요. 그건 방금 제 로컬 저장소를 압축한 repository.zip 파일을 받아서 여러분의 로컬 저장소에 덮어써 주시는 겁니다.

http://whiteship.me/book/repository.zip

이 파일을 받으셔서 여러분의 홈 디렉토리/.m2/repository에 복사해 넣으신 다음에 프로젝트 import를 다시 해보세요. 그럼 메이븐 관련 문제는 잘 해결될 겁니다.

신순웅님: https://groups.google.com/forum/?fromgroups=#!topic/springsprout/QrvoPfpE7pM

신숭웅님의 이슈는 처음에 제가 잘못보고 이것도 메이븐 의존성 관련 이슈인줄로 착각했습니다. 그런데 다시 로그를 보니까 이건 메이븐 의존성 문제가 아니라 메이븐 빌드를 실행할때 실행할 goal을 아무것도 적지 않았을 때 발생하는 로그였습니다.

그래서 이건 이슈가 아니라.. 지금 뭔가 빌드를 잘못실행하고 계신걸로 추정이되고요. 무얼 하셨을 때.. 제 책의 어느 부분을 따라하고 계실때 발생한 에러인지 조금 더 전후 상황 정보가 필요한 상황입니다.

어쨌든 지금 저 로그는 제가 방금 동영상에서도 설명드렸지만, 메이블 빌드를 아무런 goal없이 실행할 때 발생하는 로그로… 문제 상황은 아니고, 단순히 메이븐 빌드를 잘못 사용하고 계신걸로 추정됩니다.

부디 제 책을 읽고 계신분들이 무사히 제 책을 즈려밟고 올라서시기를 기원하며 그럼 이것으로 첫번째 애프터 서비스를 마치겠습니다.

제 책을 보시다가 궁금하시거나 개선하면 좋을 부분들은 계속해서 봄싹 그룹스에 의견을 남겨주시면 저 말고도 다른 분들의 의견이나 도움도 받으실 수 있으니까요. 어려워 마시고 편하게 글 남겨주세요.

감사합니다.

[maven] 역시 나만 불편한게 아니였어.

[xml]
<sourceDirectory>src/main</sourceDirectory>
<testSourceDirectory>src/test</testSourceDirectory>
<resources>
<resource>
<directory>src/main</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test</directory>
</testResource>
</testResources>
[/xml]

 

이 코드는 스프링 소스 직원이 3.1 m1 예제 코드에서 작성한 메이븐 설정 파일인데 지금 내가 사용하고 있는 코드와 거의 비슷한 구조로(완전히 같지는 않고 설정도 뭔가 미흡해 보이지만) 사용하고 있는 코드를 발견했습니다. 이미 오래전부터 여러번 포스팅 했던 내용인지라.. 또 쓰고 싶진 않네요.ㅋㅋ

암튼.., 메이븐 기본 패키지 구조는 너무 불편합니다.

1. depth가 필요 이상으로 깊어지고.

2. 소스와 관련된 설정을 찾기가 힘들고

3. 처음 보는 사람에게는 낯설답니다.

마치 빌드계의 EJB라고 할까나.. 하지만 다행인 것은 패키지 구조를 얼마든지 설정을 사용해서 원하는 대로 고쳐서 쓸 수 있다는 거…

Plain Old Java Proejct Structure(POJPS)를 원한다!!

[인텔리J] 메이븐 프로파일 선택하기

뭐 이런 간단한 것을 올리나 하겠지만.. 윤석군이 이클립스에서 프로파일 옵션 줘서 빌드해도 잘 안 바뀐다길래 인텔리J의 우수함을 뽐내 주기 위해 스크린 샷 한장을 올립니다.

윤석군 보아라..
WEB-INF 밑에 classes에 배포된 calendar.properties에 들어있는 내용인데 분명히 production이래자나.. 난 잘 된다고..
하지만 안타깝게도 넌 선택권이 없어.. 이클립스를 잘 써… 현업 나가면 어차피 다 이클립스 쓸텐데 인텔리J에 맛들이면 큰일나.. 다른거 못써. ㅋㅋ
이클립스로 어떻게든 빌드 잘 하고 메이븐 플젝 잘 써먹게 되면 그때 넘어오셩.. 그래야 인텔리J 쓰고 놀다가도 후딱 이클립스에서 프로젝트 하지. 안 그럼 난감해ㅋ

[메이븐 프로파일] 운영시 배포할 설정 파일과 개발시 배포할 설정 파일 샤샥

운영시에 사용할 설정과 배포할 때 사용할 설정이 다르다. 어떻게 해야할까요? 예전에도 이 고민을 한적이 있었는데 마침 윤석군이랑 봄싹에 구글 캐린더 연동 서비스를 구현했는데 이런 상황이 또 발생했습니다.

개발 할때 사용할 구글 캘린더와 실제 운영시 사용할 구글 캘린더는 달라야 합니다. 혹은 개발 할 때는 캘린더 서비스를 무시할 수도 있어야 하는데 이 경우는 일단 제외하고 우선은 설정을 환경에 따라 구분해야 한다는 것에 초점을 맞췄습니다.
설정 정보가 구체적으로 어떻냐에 따라 방법도 달라질 수 있는데 이전에 봄싹에 적용한 방법은 다음과 같습.. 흠… 아닙니다.. 귀찮군요. 그냥 생략하고 메이븐 프로파일이나 정리하겠습니다. 어쨋든 이전에 사용한 방법은 메이븐을 사용하지 않은 방법이었는데.. 그게 다 장,단점이 있습니다.
이번에 사용할 방법은 메이븐 프로파일을 사용합니다.
일단 폴더를 저런식으로 구분했는데 뭐 저런 구조야 맘대로 정하시면 되겠죠. 중요한건 개발시 사용할 설정파일이 담겨있는 폴더와 운영시 사용할 설정파일이 담겨있는 폴더를 구분했다는 것 정도..
이제 pom.xml에서 <build> 부분에 개발시 사용할 설정이 담겨있는 폴더를 소스 리소스 폴더로 인식하도록 설정해 줍니다.
    <build>
        …
        <resources>
           …
            <resource>
                <directory>${project.basedir}/resources/development</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>
        …
</build>
이렇게 말이죠. 대충 엘리먼트 이름만 봐도 아실테니 설명은 패스.
다음은 운영 환경에서는 저 폴더가 아니라 다른 폴더를 리소스 폴더로 등록해줘야 합니다. 따라서 pom.xml에 프로파일을 추가해 주고 그 안에서 재정의할 설정을 넣어주면 됩니다.
    <profiles>
        <profile>
            <id>production</id>
            <build>
                <resources>
                     …
                    <resource>
                        <directory>${project.basedir}/resources/production</directory>
                        <excludes>
                            <exclude>**/*.java</exclude>
                        </excludes>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>
자 요렇게 해주면 더 프로파일을 가지고 빌드 할때는 운영시 사용할 설정 파일이 담겨있는 폴더를 소스 리소스 폴더로 인식해서 그 안에 있는 .java 파일을 제외한 모든 파일을 배포해줍니다.
마지막으로.. 그럼 저 프로파일을 가지고 빌드 하는 방법은?
mvn clean install -Pproduction -X
요런식으로 mvn을 실행할 때 -P프로파일명 을 주시면 됩니다. 저기서 사용한 -X는 디버깅용 출력에 사용하는 옵션이구요. 나머진 아시겠죠.
좋은점
– 빌드 담당자가 아닌 개발자들은 이전과 동일하게 계속 개발하면 된다.
– 저 설정들을 버전관리에 포함시킬 수 있다.
– 운영 서버에서 빌드 스크립트 설정만 한번 바꿔주면 된다. 그 이후로는 간편하다.
불편한점
– 빌드 담당자(SI에 이런 롤이 있는지 몰겠지만)가 메이븐을 쬐끔 알아야 한다.
사실 위에 적은 좋은점 불편한점은 위에서 생략하고 넘어간 이전 방식과 비교를 했을 때 더 분명한데.. 일단은 그 방법을 적기가 다소 귀찮고 본 글의 주제에도 맞지 않으니 그냥 생략합니다. 대충 세가지 방법을 고민해 뒀는데 나중에 정 한가하고 정 심심해지면 정리해봐야겠습니다.

[Maven] Exec Maven Plugin 사용하여 자바 프로그램 실행하기

참조: http://www.vineetmanohar.com/2009/11/02/3-ways-to-run-java-main-from-maven/

이 플러그인을 사용하기 전까지 주로 사용하던 방법은 main() 메서드를 가지고 있는 자바 파일을 만들지 않고 그냥 테스트 클래스를 만드는 겁니다. 그러면 mvn test를 실행할 때 자동으로 실행되죠ㅋㅋ. 하지만 이 방법은 왠지 편법 같아서 main() 메서드를 가지고 있는 클래스를 실행해볼까 해서 찾아봤더니 exec 플러그인이 있더군요.

http://mojo.codehaus.org/exec-maven-plugin/index.html

1. pom.xml에 플러그인 추가하기

<plugins>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1.1</version>
            </plugin>

</plugins>

2. goal

이 플러그인이 제공하는 goal은 세 가지가 있습니다.

exec:exec 외부 프로그램 실행하기
exec:help exec 플러그인 도움말 보기
exec:java 현재 VM에 있는 메인 클래스 실행하기

3. 사용하기

흠.. compile은 별도로 해줘야 하기 때문에 mvn:compile 정도를 한 뒤 mvn:java -Dexec.mainClass=”실행할 클래스명”을 할 수도 있지만… 불편하죠;

mvn test만 사용해서 실행하도록 executions를 이용해서 test Phase에 java Goal을 끼워줍니다. 즉 pom.xml에 플러그인 설정을 다음과 같이 해줍니다.

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1.1</version>
                <executions>
                    <execution>
                        <phase>test</phase>
                        <goals>
                            <goal>java</goal>
                        </goals>
                        <configuration>
                            <mainClass>whiteship.backup.BackupRunner</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

그럼 이제 mvn test을 실행하는 .bat 파일 만들어 놓고 윈도우의 ‘예약작업’으로 주기적으로 실행하도록 해놓으면 백업 배치 끝!! (리눅스라면 cron으로..블라 블라)

ps1: 어떻게보면 이 방법이 자바 애플리케이션을 서버처럼 띄워서 스케줄링하는 것 보다 시스템도 효율적으로 쓰는 것 같고 간편하네요.

ps2: 특히 윈도우의 예약작업은 리눅스의 cron처럼 공부하지 않아도 쓸 수 있으니.. 이럴 땐 윈도우도 좋네요.