0907 개발일지

Yesol Lee·2022년 9월 7일
0

개발일지 - 2022

목록 보기
130/187

오늘 한 일

  • 뉴스레터 : 설문지 업데이트 (완성), 기안문 초안 작성, 기안문 메일 송부 완료
  • 사이드 프로젝트 : 첨부파일 정보 더미데이터 삽입, 화면에 첨부파일명 보이기 추가

사이드 프로젝트

java의 split()

  • 파일명에서 확장자를 분리해서 저장하기 위해 split() 함수 인자로 "."를 전달했는데 자꾸 outofindex 에러가 떴다.
  • 알고보니 split을 마침표 기준으로 할 때는 그냥 전달할 수 없고 정규표현식에 맞게 전달해주어야 했다.
  • 화면에서 파일의 원래 이름을 볼 수 있도록 처리했다.
// 안되는 코드
attach.setATTF_EXE(filenames[Id].split(".")[1]);

// 되는 코드
attach.setATTF_EXE(filenames[Id].split("\\.")[1]);

업데이트 시 java.lang.NullPointerException: LocalDateTime 관련

java.lang.NullPointerException: text
at java.util.Objects.requireNonNull(Unknown Source) ~[na:1.8.0_281]
at java.time.format.DateTimeFormatter.parse(Unknown Source) ~[na:1.8.0_281]
at java.time.LocalDateTime.parse(Unknown Source) ~[na:1.8.0_281]
at java.time.LocalDateTime.parse(Unknown Source) ~[na:1.8.0_281]
at com.ticktack.homey.domain.PostForm.getPostFromPostForm(PostForm.java:131) ~[main/:na]
at com.ticktack.homey.controller.PostController.updatePost(PostController.java:86) ~[main/:na]

  • Post 클래스는 게시물 정보만 담겨있고, PostForm 는 게시물 정보 + 댓글 리스트 + 첨부파일 객체까지 가지고 있는 클래스이다. 매번 set, get으로 클래스 변환하기 귀찮아서 각 클래스에 타입 변환한 객체를 반환하는 메소드를 만들었다.
  • 게시물 update 시 PostForm객체에 담긴 내용을 Post객체로 변환하여 저장하게 되는데, 최초 생성일, 최종 수정일 값이 null인데 LocalDateTime 타입 변수에 그냥 저장하려고 하면 에러가 발생한다.
  • Date를 처리하는 부분을 전부 Optional로 감싸서 null체크 후 값을 세팅할 수 있도록 변경하였다.
// PostForm.java
// PostForm을 Post 객체로 변환해서 반환
public Post getPostFromPostForm () {
	Post post = new Post();
	...
	Optional.ofNullable(this.getPOST_DATE()).ifPresent(s -> post.setPOST_DATE(LocalDateTime.parse(s)));
	Optional.ofNullable(this.getPOST_UPDATE()).ifPresent(s -> post.setPOST_UPDATE(LocalDateTime.parse(s)));
	...
	post.setATTF_ID(this.getATTF_ID());
	return post;		
}

더미데이터 삽입 부분 분리

  • 사용자(user), 게시물(post), 댓글(comment), 첨부파일정보(attach) 등 다양한 종류의 더미데이터가 필요하다.
  • 원래 PostController 안에 함수 및 데이터를 두고 더미데이터를 추가했는데, 나 뿐만 아니라 다른 팀원들도 더미데이터를 사용할 부분이 있을 것 같아 별로 클래스로 빼기로 했다.
  • 추후 더미데이터 로직이 바뀌더라도 원래 코드는 변경되지 않도록 하기 위해 중간에 인터페이스를 하나 두었다. (실제로 코드 변경할 일이 몇 번이나 있었는데 메소드를 사용하는 코드는 변경하지 않아도 되어 뿌듯했다!)
  • DummyData 관련 인터페이스, 구현체를 SpringConfig.java에서 bean으로 등록
  • DummyData 인터페이스를 DummyDataImpl에서 구현

대댓글 더미데이터 삽입 코드 추가

  • 대댓글은 댓글이 있어야만 추가할 수 있으므로 게시물 id를 기준으로 댓글 리스트를 먼저 불러온 후, 해당 댓글을 돌면서 대댓글을 추가한다.
// DummyDataImpl.java
@Override
public void setReplyComments(Long postId) {
	System.out.println("더미 대댓글 삽입 시작");
	Comment tmp = new Comment();
	tmp.setPostId(postId);
	List<Comment> comments = commentService.commAllList(tmp);
	
	for (Comment comment : comments) {
		if(comment.getCommId()%2!=0) {
			Comment reply = new Comment();
			
			reply.setPostId(comment.getPostId());
			reply.setCommCont("-->" + comment.getCommCont() + "에 대한 대댓글");
			reply.setCommWriter(comment.getCommWriter());
			reply.setCommUpid(comment.getCommId());
			
			commentService.commInsert(reply);
		}
	}
}

인프런 강의 수강

  • 스프링 핵심 원리 - 기본편 수강 중

제어의 역전 (IoC, Inversion of Control)

  • 프로그램의 제어 흐름을 구현 객체가 직접 제어하지 않고, 외부에서 (SpringConfig등) 관리하는 것
  • 프레임워크 : 프레임워크가 내가 작성한 코드를 제어하고 대신 실행하는 것 (JUnit 등)
  • 라이브러리 : 내가 작성한 코드가 직접 제어 흐름을 담당하면 프레임워크 아닌 라이브러리

의존관계 주입 (DI, Dependency Injection)

  • 코드 실행 전 정적인 클래스 의존관계 / 코드 실행 시점에 결정되는 동적 인스턴스(구현체) 관계 분리해야 함
  • 애플리케이션 실행시점에 외부에서 실제 구현 객체 생성하고 클라이언트에 전달해서 클라이언트-서버 간 실제 의존관계 연결되는 것을 의존관계 주입이라고 한다.
  • 의존관계 주입할 경우 정적 클래스 의존관계 변경 없음

IoC 컨테이너, DI 컨테이너

  • AppConfig처럼 객체 생성, 의존관계 연결하는 것

DI를 Spring기반으로 변경하기

  1. AppConfig 클래스명 위에 @Configuration 추가
  2. 각 메소드 위에 @Bean 추가

스프링 기반 실행 (memberApp)

  1. ApplicationContext : 스프링 컨테이너 시작점
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
  1. getBean()으로 가져오기
profile
문서화를 좋아하는 개발자

0개의 댓글