자바 14

버저닝 ... 2

⬇️버저닝 ... 1편⬇️ 버저닝 ... 안드로이드와 협업을 할 때 버저닝은 필수적이다. 왜냐하면 죽어도 앱 업데이트를 안하는 사람들(대표적으로 나)가 있기 때문 올해 중순까지만 해도 카카오톡 업데이트를 안해서 보이스톡 기능 finger-ineedyourhelp.tistory.com 포스팅 이후에 팀원들과 버저닝에 대해 토의하는 시간을 한번 더 가졌다. "호환성"과 "추후에 강제 업데이트하는 상황"에 대해 생각을 더 해보다가 이야기가 나왔던 것인데, (Major).(Minor).(Patch)에서 Major 버전을 언제 올릴지가 주된 토의 내용이었다. - 기존 특정 기능에 대한 API가 바뀌면 Major를 올린다. 예를들어 회원정보조회 API가 바뀌며 Major 버전을 1에서 2로 올릴때, 서버에서는 1과..

버저닝 ...

안드로이드와 협업을 할 때 버저닝은 필수적이다. 왜냐하면 죽어도 앱 업데이트를 안하는 사람들(대표적으로 나)가 있기 때문 올해 중순까지만 해도 카카오톡 업데이트를 안해서 보이스톡 기능을 못썼다. 지금 쿠팡앱 켜도 맨날 업데이트 하라고 하는데 이악물고 무시중... 핸드폰 저장공간이 부족한 탓이다. 하지만 죽어도 게임은 못지움. 아무리 권태기가 오더라도 언젠간 다시 돌아가기 때문 어쨌든 안드로이드 앱의 버전은 1.1.2 이런 형식인데 (Major).(Minor).(Patch) 이렇게 구성된다. 우리 이돈이면 팀은 대충 Api가 바뀌어서 버전 호환이 안되면 Major 버전이 올라가고, 기존의 Api는 바뀌지 않고 새로운 Api가 추가되거나 비즈니스 로직이 변경되는 정도에서 끝나면 Minor 버전이 올라가고, ..

포스트맨으로 MultiPart 파일 보내는 방법!!(사진 첨부해서 요청보내기)

이것이 내가 속한 이돈이면 팀의 게시글 작성 요청 Dto의 모습이다. 이번에 자바 17을 쓰는 김에 야무지게 record 클래스를 써보았다. 이것은 컨트롤러다. Json을 받을때는 @RequestBody를 썼는데, 이번에는 multipart/form-data를 받아서 @ModelAttribute를 붙여야 했다. 아무튼! 우리 프로젝트는 게시글 작성 요청에 이미지 파일이 multipart 형태로 담겨져 와서, 이를 포스트맨으로 테스트 할 수 있는 방법을 찾아보았다. 위에처럼 Body 탭에 form-data를 선택하면, Key의 타입을 Text과 File 중에 선택할 수 있는데, File로 선택하면 Value로 여러개의 파일을 첨부할 수 있다!! 맨날 json만 보내보다가 이렇게 보내보니 조금 신기하다. 어..

[Spring 스프링] 스프링은 뭐지? 왜 스프링을 쓸까?

우테코 레벨2를 시작하는 처음에 궁금했던 내용인데, 스프링 사용법과 미션 구현에 쫓기다가 궁금증을 해결하지 못하고 레벨2가 끝나버렸다. 거기다가 레벨 인터뷰때 도기가 이 질문을 해줘서 나의 빈공간을 잘 찔러주었다. 이렇게 궁금증 해소를 미루던 와중에! 이번 방학때 인프런에서 김영한님의 강의를 듣다가 어느정도 가닥이 잡힌 것 같아서, 생각난김에 이번에 알게된 내용을 정리 해보려 한다. 스프링은 뭐지? 🧐 스프링? 스프링은 여러가지 기술들의 모음이다. 스프링에서 핵심이 되고, 필수적으로 사용되는 기술로는 스프링 프레임워크와 스프링 부트가 있고, 선택적으로 더 많은 기술들을 적용할 수 있다. 스프링 사이트에서 다른 기술들로는 뭐가 있는지 확인할 수 있다. 🧐 스프링 프레임워크? 스프링에서 핵심이 되는 것이 스..

[Spring 스프링] HandlerInterceptorAdapter 말고 HandlerInterceptor

'org.springframework.web.servlet.handler.HandlerInterceptorAdapter' is deprecated HandlerInterceptorAdapter를 상속해서 인터셉터를 구현하고 있었는데, 노란색 블러가 거슬렸다. 스프링 5.3 버전 이상부터는 권장되지 않는다고 한다. 대신 HandlerInterceptor 또는 AsyncHandlerInterceptor 인터페이스를 직접 사용하라고 적혀있다. 참고로 HandlerInterceptorAdapter는 AsyncHandlerInterceptor를 구현한 것이다. 그나저나 @Deprecated 어노테이션으로 인해 노란 블러로 경고가 뜬 건가보다. 신기방기 그리고 안에 뭐 따로 구현된 것도 없다. @Deprecated..

[Spring 스프링] @SpringBootTest로 테스트할 때 데이터베이스 롤백하기

이번 장바구니 미션에서 컨트롤러 테스트 코드를 짤 때 @SpringBootTest어노테이션을 붙여서 짜면서 데이터베이스 롤백과 관련한 문제를 마주했다. 상품목록에 상품을 수정, 삭제하는 테스트 코드가 각각 있었는데, 항상 자동으로 수정 -> 삭제 순서로 테스트가 돌아가다가, @Order 어노테이션을 이용해서 삭제 -> 수정 순서로 돌려보니 테스트가 깨지는 것을 확인했다. 아무래도 이미 삭제된 상품을 수정하려고 하니 오류가 터진 것이겠군~ 디비 롤백을 해줘야겠네! 생각하고, 예전에 어디선가 @Transactional 어노테이션을 테스트에 붙이면 테스트가 끝난 후 변경된 내용들을 다시 롤백해준다고 들었기에 @Transactional 어노테이션을 붙여보았지만 여전히 테스트 코드는 깨졌다. 공식문서를 확인해보니..

[Spring 스프링] JdbcTemplate 써보기

스프링 공식문서를 참조해서 JdbcTemplate 사용법을 정리해보았다. JdbcTemplate 생성 스프링 공식문서에 따르면 JdbcTemplate을 생성하는 방법은 두가지가 있다. 1. DAO 구현체가 DataSource를 통해 JdbcTemplate를 직접 인스턴스화 2. 스프링 IoC 컨테이너에서 DAO에게 빈 참조로 제공 하지만 프로젝트의 의존성에 spring-boot-starter-jdbc 모듈을 추가한다면 스프링 부트가 DataSource와 JdbcTemplate 객체를 자동으로 IoC 컨테이너에 설정해준다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' } 그러니까 우리는 IoC 컨테이너에 ..

[Spring 스프링] @Component, @Repository, @Service, @Controller 는 뭐가 다를까

프로그램을 짜면서 @Component를 달아보기도 하고, @Repository로 바꿔서 달아보기도 했다. 근데 둘 다 프로그램이 잘 돌아간다. 궁금해져서 차이점을 찾아봤다. 🐣 컴포넌트 스캐닝 @ComponentScan 어노테이션을 달고있는 어플리케이션이 위치하는 패키지 내에서 이루어진다. 컴포넌트 스캐닝을 통해 @Component 어노테이션이 달린 클래스들을 빈으로 만든다. 🐣 @Component 스프링에서는 @Component을 사용하여 빈을 선택하고 등록한다. 🐣 @Repository, @Service, @Controller 각각의 어노테이션을 까고 들어가보면 @Component라는 어노테이션을 달고 있음을 확인할 수 있다. @Component가 일반화된 어노테이션이라고 생각하면 된다. 대충 코드를..

[JAVA 자바] chat gpt와 SOLID 원칙에 대해 공부를 해보았다(2)

👇chat gpt와 SOLID 원칙에 대해 공부를 해보았다 1편👇 [JAVA 자바] chat gpt와 SOLID 원칙에 대해 공부를 해보았다(1) 요즘 책을 읽으면서도, 강의를 들으면서도 가끔 SOLID 원칙이 언급되길래, 한번 chat gpt와 대화하며 공부한 내용을 정리해 보았다. 🤔 SOLID 원칙이란? 객체 지향 프로그래밍에서 유지보수와 확장을 finger-ineedyourhelp.tistory.com 지난 포스팅에 이어, 이번 포스팅에서는 인터페이스 분리 원칙(ISP)와 의존관계 역전원칙(DIP)를 다룬다. 🍏 I 인터페이스 분리 원칙 (ISP, Interface segregation principle) 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다. 즉, 인터페이스를 작게 분..

[JAVA 자바] 추상클래스의 올바른 사용 방법

오늘 체스 미션 코드리뷰에서 추상 클래스에 대한 피드백을 받아서, 이 내용에 대해 한번 스스로 정리해보고자 한다. 먼저 코드리뷰를 받은 문제의 코드를 보여주겠다. 체스에서 Queen, King, Rook, Pawn, Knight, Bishop이라는 기물들에 대한 클래스를 먼저 작성하였고, 코드를 작성하다보니 코드가 중복되는 부분이 많아서, 중복되는 부분은 모두 체스 기물을 추상화한 Piece라는 추상클래스에 올렸다. public abstract class Piece { protected final Team team; protected final Movement movement; public Piece(Team team, Movement movement) { this.team = team; this.mov..

1 2