Spring 22

[2022년 8-11월] Spring에서 플러터 개발자로

최초작성일: 2022년 12월 3일 0. 시작하며 8월에 이직을 하고 플러터 개발을 시작하면서 여러가지 재미있는 경험을 많이 하게 되었고, 최근에는 앞으로의 방향성에 대해 고민도 많았다. 최근에 회고를 거의 못하기도 했고, 새로운 블로그로 이사하면서 한 번 정리를 하고 가면 좋을 것 같아서 회고글을 작성하게 되었다. 1. 이직 올해 1월, 개발을 해보고 싶어서 부트캠프를 시작하게 되었고, Spring으로 서버 개발을 공부하고 5월에 취업을 하게 되었다. 이미 어느정도 자리를 잡은 안정적인 회사였고, 인터뷰도 굉장히 인상적이었다. 그렇지만 3개월만에 이직을 하게 되었다. 인터뷰에 들어온 개발자들은 클린코드를 추구하고 있었고, 에자일 등 개발 프로세스나 개발 환경에도 관심이 많았다. 그렇지만 입사를 하고 나..

회고 2023.07.16

20220803 #Factory

휴가가 끝나고 돌아오니, 새로운 리펙토링이 있었다. 휴가를 가기 전에 전략패턴을 사용하면서 type에 맞는 구현체를 찾아올 때 어떤 방법이 좋을지 고민이 있었다. 컨트롤러에서 해당 구현체를 List로 주입하고 type을 비교하는 메서드를 하나 만들어서 해당 구현체를 넣어주었는데, 구현체를 찾기 위한 목적의 메서드를 하나 만든다는 것에서 좋은 방법은 아닌 것 같았다. 팩토리를 사용하자는 의견이 있었는데, 며칠 자리를 비운 사이에 리팩토링이 되어 있었다. 컨트롤러에서는 Factory에 있는 메서드를 사용하고, Factory에서는 switch문을 사용해서 type에 따라 알맞은 구현체의 해당 메서드가 실행되도록 하였다. Factory가 너무 지저분해지지 않을까, 하는 걱정도 있었는데 구현해놓고 보니 오히려 가..

회고 2022.08.07

20220706 TIL #테스트코드 리펙토링 @DataJpaTest @SpringBootTest

프로젝트에서 추가되거나 변경된 기능이 많다보니 사용하지 않는 변수나 메소드, enum이 많아졌다. 아직 어떤 맥락인지 파악이 가능할 때 정리하는 게 좋을 것 같아서 틈틈히 수정하고 있다. 비즈니스 로직을 수정하다보면 테스트코드도 수정이 필요할 때가 있어서 같이 보게 되는데, 테스트코드에도 삭제하고 치워야 할 흔적들이 많이 남아있었다. 특히 테스트코드에서 TestBase 클래스를 만들어서 공통으로 사용하는 클래스를 주입하거나 설정들을 동일하게 사용하는 경우들이 있었는데, 계속 새로 추가되면서 비슷한 TestBase 클래스가 여러 개 생긴 것을 확인할 수 있었다. 현재 프로젝트에서 단위테스트와 통합테스트를 하고 있는데, 통합테스트의 경우에는 @DataJpaTest를 사용하는 경우도 있고, @SpringBoo..

회고 2022.07.08

[디자인패턴]controller pathvariable로 service 구현체 주입하기

인터페이스를 구현하는 여러 service 구현체가 있을 때, controller에서 pathvariable을 통해 구현체를 주입할 수 있다. 먼저 인터페이스를 하나 만들고, A와 B 두개의 구현체를 만들었다. public interface TestInterface { void save(); Type getType(); } @Service public class TestAImpl implements TestInterface { Type type; public Type getType() { return Type.A; } @Override public void save() { System.out.println("save A"); } } @Service public class TestBImpl implement..

Language/JAVA 2022.06.16

20220519 TIL #Thymeleaf #dataList #Vue

검색 조건에 국적를 추가하기 위해, 1) DB에 저장된 Country 테이블을 조회해서 dataList로 선택할 수 있게 보여주기 2) 해당 국적으로 검색 시 해당되는 데이터 조회하도록 수정하기 를 해야했다. 처음에는 DB에 있는 country를 조회하는 api를 RestApi로 만들고, 뷰에서 axios로 데이터를 가져와서 보여주려고 했는데, 어차피 정적인 데이터이므로 아에 model attribute + thymeleaf로 뿌려도 될 것 같다는 얘기를 들었다. 해당 페이지를 랜더링할 때 같이 데이터가 나가도록 해당 컨트롤러에 만들어 놓은 서비스를 주입해서 data를 view와 함께 같이 내려주었다. 그리고 view에서 input이 아니라 dataList를 사용하여 자동완성되도록 하기로 했다. 다행히 ..

회고 2022.05.20

20220517 TIL #함수형 인터페이스 #log남기기

오늘 함수형 인터페이스, @Functional Interface에 대해 알게 되었다. 이 인터페이스의 특징은 추상메소드를 하나만 가진다는 것인데(default, static 제외), 정말 재미있어 보이는 점은 이런 예제가 있다는 점이다!!! https://tecoble.techcourse.co.kr/post/2021-11-21-functional-interface-with-lambda/ 함수형 인터페이스와 람다를 이용한 코드 중복 제거 … tecoble.techcourse.co.kr 코딩을 하면서 코드가 정말 비슷해서 리펙토링을 하고 싶은데 정말 애매하게 메서드만 다른 경우를 꽤 봤다. 이거는 어떻게 할 수 없을까, 하는 고민이 있었는데 함수형 인터페이스의 이런 점들을 활용하면 뭔가 코드를 더 깔끔하게 ..

회고 2022.05.17

[JPA] No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call;

특정 조건에서는 delete 후에 save가 되는 로직이 있었는데, 다음의 에러가 발생했다. Resolved [org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process '..

Error 2022.05.13

#Springboot - MySQL : Field 'id' doesn't have a default value

실전 프로젝트 중에 간간히 떴던 에러가 있었다..!! 최종발표회 이후 이 에러때문에 서비스가 정상적으로 작동하지 않았다는 것을 보고 얼마나 놀랐는지....! 그래서 그 뒤로 매일 체크해보고 있는데, 오늘 또 같은 에러가 떴다. java.sql.SQLException: Field 'id' doesn't have a default value at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ... 구글링에서는 pk인 id 값에서 AI가 ..

Error 2022.04.19

20220310 개발일지 #서버 2개 돌리기 + node에서 mysql연결하기

유저의 로딩 완료 문제를 처리하다가, 로딩 중에 연결이 끊기면 어떻게 되지? 라는 질문이 나왔다. 기본적으로 클라이언트가 방에 들어오면 socket통신으로 연결되기 때문에, 연결이 끊기면 socket.io에서 가장 먼저 알게된다. 문제는 이렇게 연결이 끊긴 것을 spring 서버에서 알고 db에서 처리를 해줘야 한다는 점이다. 메인페이지에서 방 리스트를 조회할 때 방의 인원수도 같이 표시되기 때문에 업데이트를 해줘야 한다. 그래서 처음에 고민했던 것은 node에서 spring으로 바로 socket.id를 알려주는 것이다. socket의 disconnect 이벤트 안에서 spring으로 데이터를 보내줘야 하는데 socket 통신에서 HTTP 통신을 쓸 수 있는지 알 수 없었다.(불가능하지 않을까?) 서버 ..

20220303 개발일지 #socket.io

nodeJS로 socket.io를 구현하기 위해 먼저 노마드코더에서 무료로 제공하는 줌 클론코딩 강의를 듣고 해당 코드를 가지고 서버에 올려서 프론트와 연결해보기로 했다. 강의 듣기 전에 node에 대해서 너무 모르는 상태라서 코드잇에 있는 강의를 앞부분만 들었다. 비동기 개념이 너무 신기했고, 서버를 정말 간단하게 구현할 수 있다는 것이 놀라웠다...! 아직 스프링도 잘 이해한 상태가 아니라서 제대로 비교하기는 그렇지만 확실히 다른 타입인 것 같다. 또, 자바와 스프링을 조금 하고 공부를 시작하니 라이브러리를 인포트에서 쓴다던지, 필요한 객체를 선언하는 거라든지 클라이언트와 서버에 대한 기본적인 관계는 이해가 되어 있어서 가볍게 지나갈 수 있었다. 하나를 잘 해놓으면 다른 언어나 프레임워크를 배우기 수..