[spring] 로또번호맞추기로 log 찍기(연습)
연습할 내용
1-1. 랜덤으로 로또 번호를 생성하는 기능을 추가 (중복 X, 1~45개 중, 7개의 숫자)
1-2. 최초로 당첨번호를 정하고 당첨이 될때까지 뽑는 메서드를 추가
2. 해당 메서드에 대한 테스트를 작성.
3. 해당 메서드에 대해 몇번만에 로또번호와 동일한 값을 뽑았는지를 로그파일로 남기기.
<원래는 테스트의 성공 유무를 보여주는게 맞는 목적이지만, log자체의 개념을 이해한다는 취지하에 한번 위와 같은 방식으로 시도해보았다.>
일단, 자바코드를 작성하는곳인, src/main/java에다가 lotto관련된 클래스를 위한 패키지를 따로 팠다.
// Lotto.java클래스
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
@Repository
public class Lotto {
public boolean setRandomVal() {
ArrayList<Integer> myVals = getRandomVals();
log.trace(String.format("--------------------------------------------"));
log.trace(String.format("당첨번호 값들 : %s ", myVals.toString()));
int cnt = 0;
ArrayList<Integer> vals;
while(true) {
vals = getRandomVals();
cnt += 1;
if(vals.containsAll(myVals)) {
break;
}
}
log.trace(String.format("맞춘 번호값들 : %s ", vals.toString()));
log.trace(String.format("%d만에 같은 번호 뽑음", cnt));
log.trace(String.format("--------------------------------------------"));
return true;
}//setRandomVal
public ArrayList<Integer> getRandomVals(){
ArrayList<Integer> arr = new ArrayList<>();
while(arr.size() < 7) {
int num = (int)(Math.random()*45 + 1);
if(!arr.contains(num)){
arr.add(num);
}
}
return arr;
}
}
그리고, 이 패키지를 컨텍스트로 스캔해갈 수 있게,
root-context.xml에 해당 패키지를 스캔목록으로 작성해준다.
// root-context.xml
<beans ~~~>
~~~~~~~~
~~~~~~~~
<context:component-scan base-package="com.itbank.practice.lotto"/>
</beans>
그 다음에 로그를 남기기 위해서, log4j이라는 자바의 로깅프로그램을 이용하게 된다.
근데 내가 스프링을 이용하게 위해 이클립스용 sts번들을 이용할때 기본적으로 다운로드가 되어있지만 이건 너무 옛날 버젼이기때문에 pom.xml에 제일 최신버젼은 아니지만 1.2.17버젼으로 바꿔줬다.
//pom.xml
~~~
~~~
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
~~
~~
그리고 우리는 test를 위한 로그를 찍을것이기때문에 src/test/resources에 있는
log4j.xml에 lotto클래스가 제대로 잘 동작하는지 테스트할것이기때문에 그곳에 추가적인 작업을 해야 한다. 그전에,
<!-- Appenders -->
<appender name="file" class="org.apache.log4j.FileAppender">
<param name="file" value="./note/log/myLog.log"/> // 어떤위치에 어떤 파일명으로 log를 만들지 지정.
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyy-MM-dd HH:mm:ss}] %-5p: %c - %m%n" />
</layout>
</appender>
이 내용을 추가해줘서 log파일을 생성하게 할것이다.
log파일뿐만 아니라 html, 콘솔 등 다양한걸 여기에 기능을 추가해줄 수 있지만 우리는 기본 log파일부터 테스트해 볼 것이다.
그리고 또, 새로운 클래스에 대해 로그를 만들어준다는 내용을 넣어줘야 한다.
// Lotto클래스를 log를 이용해 test하기위해,
<logger name="com.itbank.practice.lotto">
<level value="trace" /> // 어떤 log level이상부터 내용을 출력해줄것인지 지정.
<appender-ref ref="file"/>// 위에 작성한 만들 appender내용에다가 이 lott클래스를 추가해주겠다는 의미로 appender name과 일치하게, appender-ref ref="file" 를 꼭 해줘야 한다!!
</logger>
이제, 테스트를 하기위해 만든 src/test/java위치해 있는 자바파일에서 테스트를 진행해보자.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class UtilTest {
//url을 전달받으면 해당 url에서 도메인부분만 리턴해주는 메서드를 만들고 테스트 메서드를 작성해봐라
// 단위 테스트시에 스프링 컨텍스트(의 Bean)을 불러와서 사용하기 위해서는 별도의 설정이 필요하다.
//(spring-test필요)
@Autowired
MyUtil util;
@Autowired
Fruit fruit;
@Autowired
Lotto lotto;
private Logger log = Logger.getLogger(getClass());
@Before
public void initTest() {
//System.out.println("Before가 실행되었습니다.");
// 실제서비스
log.fatal("Before가 실행되었습니다.");
log.error("Before가 실행되었습니다.");
log.warn("Before가 실행되었습니다.");
log.info("Before가 실행되었습니다.");
log.debug("Before가 실행되었습니다.");
log.trace("Before가 실행되었습니다.");
// 개발단계
}
@Test
public void lottoTest() {
assertTrue(lotto.setRandomVal());
}
}
로그내용을 확인해보면,
잘 나오는 것을 확인했다.
Author And Source
이 문제에 관하여([spring] 로또번호맞추기로 log 찍기(연습)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kjy5947/spring-로또번호맞추기로-log-찍기연습저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)