[spring] 로또번호맞추기로 log 찍기(연습)

21318 단어 SpringlogSpring

연습할 내용

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());
	}

}

로그내용을 확인해보면,

잘 나오는 것을 확인했다.

좋은 웹페이지 즐겨찾기