프롬프트 AI&OpenAPI&공공데이터를 활용한 웹앱개발자 양성 과정 36일차(MyBatis설정)

서명원·2024년 1월 29일

1. 과제 및 고민과 구현

과제: 스프링으로 게시글 삭제 수정 기능 구현.
개인적 고민: 그 동안 Optional을 애용해 게시글 여부 판별했는데,
단순히 옵셔널.empty()로 확인하고있어 이래서야 null체크와 다를바 없다는 생각이 들었다.
이번에 ifPresentOrElse를 사용해 처리하려했는데, 람다식 같은 경우 내부에서 변수를 사용할 경우 그 변수가 final 이거나 그에 준할 필요가 있었다.
그래서 builder나 list같이 객체를 외부에서 선언해주고, 람다식 안에서 객체를 제어하는 식으로 짜고, 변수 자체의 값(주소값)은 고정하고, 람다식 내부에서는 해당 변수를 통해 실제값을 제어하는 식으로 코딩하였다.

	@RequestMapping("/usr/article/doDelete")
	@ResponseBody
	public String doDelete(int id) {
		Optional<Article> findArticle=
		articles.stream().filter(article->article.getId()==id).findFirst();
		StringBuilder result = new StringBuilder();
		result.append(id);
		findArticle.ifPresentOrElse(artilce->{articles.remove(findArticle.get());
		result.append("번 글이 삭제되었습니다.");
		}, 
				()->{result.append("번 글이 존재하지 않습니다.");});
		return result.toString();
	}
    
    
    @RequestMapping("/usr/article/doModify")
	@ResponseBody
	public Object doModify(int id, String title, String body) {
		Optional<Article> findArticle=
		articles.stream().filter(article->article.getId()==id).findFirst();
		final List<Object> result = new ArrayList<>();

		findArticle.ifPresentOrElse(artilce->{
			List<Object> list = new ArrayList<>();
			artilce.setTitle(title);
			artilce.setBody(body);
			list.add(id+"번 글이 수정되었습니다.");
			list.add(artilce);
			result.add(list);
		}, 
		()->{result.add(id+"번 글은 존재하지 않습니다.");});
	
		
		return result.get(0);
	}

2. 강사님 코드를 보며 배운 점.

강사님은 테스트 데이터 만드는 메소드 작성에서, 다른 메서드와 중복되는 메서드는 따로 분리하는 리펙토링 작업을 했다.
유지보수차원에서 겹치는 로직이 있으면 찾아내어 바로바로 분리하는 습관을 들이자.
(일단 완성하면 '했다! 끝' 이아니라 리펙토링 가능한 부분이 있는지 찾아볼 것')

3. 서비스 메서드와 액션 메서드

서비스 메서드 : 비즈니스 로직을 처리하고 데이터를 다루는 역할. 어플리케이션 내부에서 호출.
액션 메서드: 사용자의 요청을 받아 해당 요청에 대한 응답을 생성하는 역할. 어플리케이션 외부에서 호출

4. 생성자 주입에 대한 고찰


생성자 주입 시점에서, 특정 로직이 실행되야 할 때가 있다.
보통은 생성자 자체를 생략해도 멤버필드에 @Autowired 어노테이션을 붙이는 것 만으로도 생성자 주입이 되지만, 생성자 주입 후 거기에 의존하는 특정 로직이 실행될때는, 생성자를 명기해서 객체 생성 시점을 컨트롤 해줄 필요가 있다.

5. 프레임워크와 라이브러리

프레임워크는 애플리케이션의 기본 구조를 제공하고 흐름을 제어하는 데 중점을 두며(틀)
라이브러리는 특정 기능을 제공하여 필요한 때에 호출되는 재사용 가능한 코드 집합(도구)

6. Add Starters를 이용한 의존관계 주입



다른버전 추가하고싶으면 maven 저장소에서 직접 가져오면 된다.

mybatis의 프로퍼티스 설정

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/Spring_AM_01?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Seoul&useOldAliasMetadataBehavior=true&zeroDateTimeNehavior=convertToNull
    username: root
    password: 
mybatis:
  type-aliases-package: com.example.demo.vo

5. 트러블. insert 이후 id값을 받아올 수가 없다.

  1. 나의 해결
	@Insert("INSERT INTO article SET regDate = NOW(), updateDate = NOW(), title = #{title}, `body` = #{body}")
	@Options(useGeneratedKeys = true, keyProperty="id")
	public int writeArticle(Article article);
  1. 강사님의 해결
    insert 후에 SELECT LAST_INSERT_ID();로 last아이디를 가져오셨다.

나의 생각
이건 정석대로 generatedKey로 int값 직접 가져오는게 나을 것 같다.
이유는 다음과 같은데 insert 문 실행후 LAST_INSERT_ID()를 가져오는 사이에, 다른 insert문이 들어갈 가능성이 있어서, LAST_INSERT_ID()로 가져온 값이 정말로 등록된 해당 로우의 id값인지 확신하기가 어렵지 않을까 싶다.


6. 트러블

문제점: mybatis 매퍼 xml파일 생성시, 빨간줄이 나왔다.

해결방안: 구글링해보니 stackoverflow에 관련 질의가 있어서, 아래 해결책대로 설정했더니 해결되었다.

해결책:
Go to top bar : Window -> Preference -> Maven -> tick the option ('download artifact javadoc').

참조

profile
백엔드 취업을 꿈꾸는 일본어 전공자

0개의 댓글