기업 급 Spring 최 적 실천 - 프로젝트 배치

  • 프로젝트 목록
  • 프로젝트 의존
  • Smart Logging
  • Jetty 와 Tomcat
  • Spring 프로필
  • Maven 설정 완료
  • 자주 사용 하 는 Maven 명령
  • 프로젝트 디 렉 터 리
    Production src / main / java - JAVA 소스 패키지 디 렉 터 리 와 클래스 src / main / resources - JAVA 자원 디 렉 터 리 (예: *. properties 파일, spring 프로필 등) Test src / test / java - 테스트 코드 패키지 와 클래스 src / test / resources - 테스트 자원 디 렉 터 리 (예: *. properties 파일, spring 프로필 등)
    프로젝트 디 렉 터 리 구성 예:
    ── pom.xml └── src     ├── main     │   ├── java     │   │   └── com     │   │       └── gordondickens     │   │           └── sample     │   │               ├── domain     │   │               │   └── MyDomain.java     │   │               ├── repository     │   │               │   └── MyDomainRepository.java     │   │               ├── service     │   │               │   ├── MyDomainService.java     │   │               │   └── internal     │   │               │       └── MyDomainServiceImpl.java     │   │               └── web     │   │                   └── MyDomainController.java     │   ├── resources     │   │   ├── META-INF     │   │   │   └── spring     │   │   │       ├── applicationContext.xml     │   │   │       └── database.properties     │   │   ├── logback-access.xml     │   │   └── logback.xml     │   └── webapp     │       ├── WEB-INF     │       │   ├── classes     │       │   ├── i18n     │       │   ├── layouts     │       │   ├── spring     │       │   │   └── webmvc-config.xml     │       │   ├── views     │       │   │   ├── myDomain     │       │   │   │   ├── create.jsp     │       │   │   │   ├── list.jsp     │       │   │   │   ├── show.jsp     │       │   │   │   └── update.jsp     │       │   │   ├── dataAccessFailure.jsp     │       │   │   ├── index.jsp     │       │   │   ├── resourceNotFound.jsp     │       │   │   ├── uncaughtException.jsp     │       │   │   └── views.xml     │       │   └── web.xml     │       ├── images     │       └── styles     ├── site     │   ├── apt     │   ├── fml     │   ├── site.xml     │   └── xdoc     └── test         ├── java         │   └── com         │       └── gordondickens         │           └── sample         │               └── service         │                   └── MyDomainServiceTests.java         └── resources             ├── com             │   └── gordondickens             │       └── sample             │           └── service             │               └── MyDomainServiceTests-context.xml             └── logback-test.xml
    프로젝트 의존
    저 는 Maven 의 슈퍼 팬 입 니 다. 일치 하 는 구축 구 조 를 제공 하고 많은 플러그 인 을 가지 고 있 습 니 다.Gradle 은 Groovy 기반 의 새로운 구축 도구 로 Maven 구 조 를 지원 합 니 다.만약 당신 이 여전히 Ant 를 사용 하고 있다 면, 나 는 당신 이 Maven 이나 Gradle 로 이전 하 는 것 을 강력 히 건의 합 니 다.기업 구축 도구 가 직면 한 도전 중 하 나 는 관리 전달 적 의존 이다. 여기 서 이런 도전 에 직면 할 수 있 는 제안 이 있다.
    의존 버 전 은 < properties / > 노드 에서 지정 한 버 전 번호 보다 낮 게 사용 하지 마 십시오. 그러면 새로운 버 전 을 업그레이드 하고 테스트 하기 쉽 습 니 다.모든 플러그 인의 버 전 번 호 를 포함해 야 합 니 다!Maven 에 내 장 된 부모 POM 의 플러그 인 버 전에 의존 하지 마 십시오.관리 의존 Maven 의 < Dependency Management / > 노드 제어 현식 과 은 식 버 전!버 전 번 호 를 여기에 지정 하면 전달 성 의존 Enforcer Plugin (강제 실행 플러그 인) 을 해결 합 니 다. 호 환 되 지 않 는 (또는 오래된) jar 를 직접 (또는 간접) 포함 하 는 것 을 금지 합 니 다.예 를 들 어 SLF4J 1.5, 1.6, SLF4J 1.7 은 함께 실행 할 수 없 기 때문에 프로젝트 구축 에 혼합 의존 이 있 는 버 전 을 금지 해 야 합 니 다.Spring 은 많은 오픈 소스 프로젝트 에 사용 되 며, 오래된 버 전 을 참조 하 는 경우 도 있 습 니 다. 따라서 Google 구축 에 포 함 된 spring jar 버 전 을 제어 해 야 합 니 다.강제 실행 예: · JAVA 1.6 사용 확 보 · MAVEN 버 전 2.2.1 - 3.0. x · spring 을 확보 하 는 jar 는 3.1 또는 업데이트 버 전 · 오래된 javassist 금지,org. java ssist · commons - logging 이나 commons - logging - api 의존 이 없 는 지 확 보 · log4j 의존 이 없 는 지 확 보 · slf4j 1.5 또는 1.6 의존 이 없 는 지 확 보 · 낡은 hsqldb 금지, org. hsqldb · 낡은 aspectj 금지, org. aspectj 를 사용 해 야 합 니 다.
    <properties>
    ...
      <java.version>1.6</java.version>
    ...
      <maven.enforcer.plugin>1.2</maven.enforcer.plugin>
      <maven.version.range>[2.2.1,3.1.0)</maven.version.range>
    ...
    </properties>
     
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-enforcer-plugin</artifactId>
      <version>${maven.enforcer.plugin}</version>
      <executions>
        <execution>
          <id>enforce-banned-dependencies</id>
          <goals>
            <goal>enforce</goal>
          </goals>
          <configuration>
            <rules>
              <bannedDependencies>
                <searchTransitive>true</searchTransitive>
                <excludes>
                  <exclude>javassist:javassist</exclude>
                  <exclude>commons-logging</exclude>
                  <exclude>aspectj:aspectj*</exclude>
                  <exclude>hsqldb:hsqldb</exclude>
                  <exclude>log4j:log4j</exclude>
                  <exclude>org.slf4j:1.5*</exclude>
                  <exclude>org.springframework:2.*</exclude>
                  <exclude>org.springframework:3.0.*</exclude>
                </excludes>
              </bannedDependencies>
              <requireMavenVersion>
                <version>${maven.version.range}</version>
              </requireMavenVersion>
              <requireJavaVersion>
                <version>${java.version}</version>
              </requireJavaVersion>
            </rules>
            <fail>true</fail>
          </configuration>
        </execution>
      </executions>
    </plugin>

    Smart Logging
    · System. out 을 사용 하지 마 세 요 · System. err 를 사용 하지 마 세 요 · 항상 SLF4j 를 사용 합 니 다 · 항상 Logback 을 사용 합 니 다 · Apache comons logging 금지 (JCL) aka Jakarta Commons Logging · Java util logging 사용 금지 (JUL) 클래스 에서 SFL4J 를 사용 해 야 합 니 다 (log4j, jcl, jul, logback 아 님):
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    ...
    public class MyClass {
      private static final Logger logger =
        LoggerFactory.getLogger(MyClass.class);
    ...
    }
    아래 의 예 에서 SLF4J 는 jacl - over - slf4j 와 jl - toslf4j 를 제공 하여 JCL 과 JUL 에 사용 합 니 다.
    Spring 은 JCL 을 사용 하기 때문에 jcl - over - slf4j 를 사용 하여 spring 의 로그 내용 을 처리 해 야 합 니 다.
    <properties>
    ...
      <logback.version>1.0.10</logback.version>
    ...
      <slf4j.version>1.7.4</slf4j.version>
    ...
    </properties>
     
    ...
     
    <dependencies>
    ...
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
      </dependency>
    ...
    </dependencies>
     
    ...
     
    <dependencyManagement>
      <dependencies>
    ...
       <!-- Logging with SLF4J & LogBack -->
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-access</artifactId>
        <version>${logback.version}</version>
      </dependency>
    ...
      </dependencies>
    </dependencyManagement>

    로그 프로필
    src/main/resources/logback.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
     
      <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
      </contextListener>
     
      <!-- To enable JMX Management -->
      <jmxConfigurator/>
     
      <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%.-1level|%-40.40logger{0}|%msg%n</pattern>
        </encoder>
      </appender>
     
      <logger name="com.mycompany.myapp" level="debug" />
      <logger name="org.springframework" level="info" />
     
      <logger name="org.springframework.beans" level="debug" />
     
      <root level="warn">
        <appender-ref ref="console" />
      </root>
    </configuration>

    src/main/resources/logback-test.xml
    같은 설정 입 니 다. 다만 이 설정 은 환경 을 테스트 하 는 데 사 용 됩 니 다.
    src/main/resources/logback-access.xml
    웹. xml 에서 Logback TeeFilter 를 사용 할 때 서버 접근 로 그 를 설정 합 니 다.
    HttpRequest 와 HttpResponses 메시지 가 표시 되 거나 기 록 될 수 있 습 니 다.RESTful 테스트 를 만 드 는 데 사용 합 니 다.
    NOTE: 로그 설정 에 ${user. dir} 을 사용 하면 로그 파일 은 프로젝트 루트 디 렉 터 리 에 생 성 됩 니 다.
    우 리 는 이것 에 근거 하여 서로 다른 생산 환경 을 배치 할 것 이다.
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
     
      <filter class="ch.qos.logback.access.filter.CountingFilter">
        <name>countingFilter</name>
      </filter>
     
      <appender name="accessfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${user.dir}/logs/app-access.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${user.dir}/logs/app-access.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
        </rollingPolicy>
     
        <encoder>
            <pattern>combined</pattern>
        </encoder>
      </appender>
     
      <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%n%fullRequest%n%fullResponse%n</pattern>
        </encoder>
      </appender>
     
      <appender name="reqrespfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${user.dir}/logs/app-req-resp.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>${user.dir}/logs/app-req-resp.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
        </rollingPolicy>
     
        <encoder>
          <pattern>%n%fullRequest%n%fullResponse%n</pattern>
        </encoder>
      </appender>
     
      <appender-ref ref="accessfile" />
      <appender-ref ref="reqrespfile" />
      <appender-ref ref="console" />
    </configuration>

    Jetty 와 Tomcat.
    개발 자 는 MAVEN 플러그 인 설정 에 따라 Jetty 나 Tomcat 를 테스트 에 사용 할 수 있 습 니 다.아래 플러그 인 은 JMX, SLF4j, Logback, Logback Access 를 설정 합 니 다.Jetty $mvn clean install Jetty: run 실행 Tomcat 7 $mvn clean install tomcat 7: run NOTE: tomcat: run 을 사용 하지 마 세 요. 오래된 tomcat 플러그 인 입 니 다.
    <properties>
    ...
      <maven.jetty.plugin>8.1.10.v20130312</maven.jetty.plugin>
    ...
      <maven.tomcat.plugin>2.1</maven.tomcat.plugin>
    ...
    </properties>
     
    ...
     
    <plugins>
    ...
      <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>${maven.tomcat.plugin}</version>
      <configuration>
        <systemProperties>
        <com.sun.management.jmxremote>true</com.sun.management.jmxremote>
        <com.sun.management.jmxremote.port>8050</com.sun.management.jmxremote.port>
        <com.sun.management.jmxremote.ssl>false</com.sun.management.jmxremote.ssl>
        <com.sun.management.jmxremote.authenticate>false</com.sun.management.jmxremote.authenticate>
        <java.util.logging.manager>org.apache.juli.ClassLoaderLogManager</java.util.logging.manager>
        <logback.ContextSelector>JNDI</logback.ContextSelector>
      </systemProperties>
      </configuration>
      <dependencies>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${slf4j.version}</version>
        <scope>runtime</scope>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
        <scope>runtime</scope>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>${slf4j.version}</version>
        <scope>runtime</scope>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
        <scope>runtime</scope>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-access</artifactId>
        <version>${logback.version}</version>
        <scope>runtime</scope>
      </dependency>
      </dependencies>
      </plugin>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>${maven.jetty.plugin}</version>
        <configuration>
          <webAppConfig>
            <contextPath>/${project.name}</contextPath>
          </webAppConfig>
          <stopPort>9966</stopPort>
          <stopKey>shutterdown</stopKey>
          <requestLog implementation="ch.qos.logback.access.jetty.RequestLogImpl">
            <fileName>./src/main/resources/logback-access.xml</fileName>
          </requestLog>
          <systemProperties>
            <systemProperty>
              <name>logback.configurationFile</name>
              <value>./src/main/resources/logback.xml</value>
            </systemProperty>
            <systemProperty>
              <name>com.sun.management.jmxremote</name>
              <value>true</value>
            </systemProperty>
            <systemProperty>
              <name>com.sun.management.jmxremote.port</name>
              <value>8050</value>
            </systemProperty>
            <systemProperty>
              <name>com.sun.management.jmxremote.ssl</name>
              <value>false</value>
            </systemProperty>
            <systemProperty>
              <name>com.sun.management.jmxremote.authenticate</name>
              <value>false</value>
            </systemProperty>
          </systemProperties>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${slf4j.version}</version>
            <scope>runtime</scope>
          </dependency>
          <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
            <scope>runtime</scope>
          </dependency>
          <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>${slf4j.version}</version>
            <scope>runtime</scope>
          </dependency>
          <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
            <scope>runtime</scope>
          </dependency>
          <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>${logback.version}</version>
            <scope>runtime</scope>
          </dependency>
        </dependencies>
      </plugin>
    ...
    </plugins>

    로그 백 도 우미 설정 (web. xml)
    Logback 상태 확인 가능
    ...
      <servlet>
        <servlet-name>ViewStatusMessages</servlet-name>
        <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>
      </servlet>
     
      <servlet-mapping>
        <servlet-name>ViewStatusMessages</servlet-name>
        <url-pattern>/logbackStatus</url-pattern>
      </servlet-mapping>
    ...
    Logback Tee Filter 를 사용 하여 HttpRequest 와 HttpResponse 의 데 이 터 를 필터 링 합 니 다.
    ...
      <filter>
        <filter-name>TeeFilter</filter-name>
        <filter-class>ch.qos.logback.access.servlet.TeeFilter</filter-class>
      </filter>
     
      <filter-mapping>
        <filter-name>TeeFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    ...

    Spring 프로필
    일치 하 는 파일 이름 규칙 을 사용 합 니 다. 모든 프로필 은 같은 접 두 사 를 가지 고 있 습 니 다. 예 를 들 어 applicationConfig *. xml.(번역 주: 저 는 app - *. xml) 예 를 들 어 app - bootstrap. xml, app - database. xml, app - cache. xml, app - security. xml 를 계속 사용 합 니 다. 뒤의 블 로그 에서 기업 급 spring 설정 의 가장 좋 은 실천 을 구체 적 으로 말씀 드 리 겠 습 니 다.설정 디 렉 터 리: src / main / resources / META - INF / spring - Spring XML 설정 디 렉 터 리 src / main / webapp / WEB - INF / spring - Spring MVC 설정 디 렉 터 리
    Maven 설정 완료
    Maven 최 적 실천 프로필 POM. xml 
    MAVEN 최 적 실천 프로필 의 특징: · 모든 버 전 번 호 는 properties 노드 에서 설정 합 니 다.Dependency Management 노드 제어 의존 전달; ·모든 버 전 번호 가 있 는 플러그 인 은 Plugin Management 노드 에서 정의 합 니 다.강제 실행 플러그 인 은 호 환 되 지 않 는 의존 도 를 구축 하지 않 습 니 다.site 플러그 인 을 사용 하여 공용 보고 가 있 는 플러그 인 을 설정 합 니 다.Eclipse 플러그 인 은 새로운 Eclipse 의 Maven 플러그 인 을 사용 합 니 다. 오래된 것 은 Sonatype 입 니 다.Idea (IntelliJ) 플러그 인 은 시간 이 지 났 습 니 다. 포함 되 지 않 습 니 다.버 전 번호 플러그 인 은 패키지 와 플러그 인의 업데이트 에 의존 하 는 지 확인 합 니 다.
    자주 사용 하 는 Maven 명령
    디 스 플레이 업데이트 의존 $mvn versions: display - dependency - updates 디 스 플레이 플러그 인 업데이트 $mvn versions: display - plugin - updates 디 스 플레이 의존 트 리 $mvn dependency: tree - ddeetail 디 스 플레이 의존 목록 $mvn dependency: list 디 스 플레이 유효한 POM $mvn help: effective - pom 디 스 플레이 항목 설정 $mvn help: effective - settings 디 스 플레이 시스템 과 환경 변수 $mvn help: system 구축 클래스 경로 (Class Path) $mvn dependency: build - classpath
    본문: Enterprise Spring Best Practices – Part 1 – Project Config 저자: 고 든

    좋은 웹페이지 즐겨찾기