블로그
전체 42025. 03. 30.
0
[인프런 워밍업클럽 백엔드 3기] 4주차 발자국
강의 수강[실습] 스프링 시큐리티 로그인 개발 [실습] Docker로 MySQL 실행하기 [실습] Docker로 프로젝트 빌드하기 [실습] Google Cloud Platform에서 Compute Engine 인스턴스 생성하기 [실습] Compute Engine에서 도커 컨테이너 실행하기[실습] 도메인 연결하기 [실습] HTTPS 적용하기 학습정말 오랜만에 도커로 프로젝트를 빌드했는데, 또 처음같았다. 역시 복습 없이는 학습은 되지 않는다...... 구글 클라우드 플랫폼으로 인스턴스 생성은 이번에 처음 해봤다! AWS랑 거의 유사한 것 같다. HTTPS 적용하는 수업도 짧지만 유익했던 것 같다 미션[미션6] 가상 프로필을 나의 프로필로 바꾸기, [미션7] 내 포트폴리오 도메인 공유하기포트폴리오를 이제 막 만들고 있어 내용 준비가 미흡했기 때문에 제출 또한 할 수 없었다. 어서 포폴 다 완성하여 여기도 잊지않고 바꿔놓고싶다 소감3~4주간 집에 오면 바로 인프런 인텔리제이 켜서 강의 1시간 듣고 3시간 추가 실습 미니 프로젝트로 복습하는 삶을 살았다... 최근 몇달 힘들다고 퇴근하면 바로 누웠는데 이걸 벗어나 오랜만에 열심히 살아본 거 같아서 뿌듯하다코틀린 이제는 혼자서 기본 코드까지는 작성 할 수 있게 됐는데, 초기에는 아예 처음보는걸 대뜸 실습부터 하니 눈에 안들어와서 보고 또보느라 시간이 더걸렸다 JPA도 재직중인 회사에선 전혀 쓰지 않아 진짜 거진 1년반만에 사용하다 보니 특히 다대다 나올땐 머리 쥐나는줄 아무튼 한창 진행중일때 어느날은 내가 이걸 왜 한다고 했을까 하면서 퇴근하기 싫기도 했는데 역시 이것 또한 지나간다? 끝나고 보니 내게 남은건 코틀린을 조금이라도 알게됐다는 사실과 다음 코틀린 공부는 지금보다는 수월할 것 같다는 생각과 JPA 빨리 다시 해야하는데 하는데 상태에서 벗어났다는 것과 아무튼 좋은 것 밖에 없다 게다가 코치님께서 진행해주신 OT, 중간점검 전부 모두 너무너무 알찬 내용이라 사실 줌 들으며 내 개발을 하려 했는데 그럴 수가 없었다 개인적으로 전 집중력이 안좋은 사람인데 풀로 집중해서 볼 정도로 정말 유익했다. 강의 진행과 스터디 진행 전부 꼼꼼하게 진행해주신 정보근 코치님께 감사드리고 인프런 스터디 진행자 분들도 고생많으셨다 인프런 스터디 참여하길 잘했다 나처럼 자력으로 공부할 의지가 잘 안붙는 사람은 꼭 하는걸 추천한다 다음엔 물론 딱 하나만 할 것이다 두개 같이 하는 분들 존경한다
백엔드
・
스프링부트
・
코틀린
2025. 03. 23.
0
[인프런 워밍업클럽 백엔드 3기] 3주차 발자국
💻강의 수강[실습] 클래스 생성[실습] 공통 개발 - Exception과 Advice[실습] 공통 개발 - DTO[실습] 공통 개발 - 인터셉터[실습] 조회 개발 - 연관관계 없음[실습] 조회 개발 - 연관관계 있음[실습] 삽입, 수정 API 개발 - 연관관계 없음[실습] 삽입, 수정, 조회 API 개발 - 연관관계 일대다[실습] 삽입, 삭제 API 개발 - 연관관계 다대다 각 엔터티의 Form과 TableDTO 라는 공통 클래스를 만들어 놨기 때문에 여러 엔터티에 한층 더 간편한 삽입/수정/삭제 API를 만들 수 있었다. TableDTO 원리가 아직 반 정도 밖에 이해되지 않아 목/금 일정인 뷰페이지에 뿌리는 과정까지 마친 후 다시 TableDTO로 돌아가려 했는데 템플릿 이슈로 잠시대기!!!! 🔨오류StudentDepartment 엔터티의 Student와 Department id를이렇게 std_id, dept_id로 가져오는 어노테이션을 넣었고, Student 엔터티에서의 id 네임도 std_id, Department 엔터티의 id 네임도 dept_id 인데, 레포지토리에서 findByStdIdAndDeptId를 전혀 인식 못하는 사태 발생구글링 끝에 이렇게 넣으니 겨우 인식됨........ 왜지? 실제 DB 컬럼명도 std_id 엔터티 설정된 네임도 std_id인데 ???아무튼 되긴하니 다행이다 💟미션강의에서 배웠던 기억 더듬어가며 (아직 이해 못한 TableDTO는 복붙..) CRUD API는 수월하게 완성! 그러나 테스트😂Mockito를 처음 써봐서 아직 감이안옴. 구글링 해가며 추가적으로 공부를 한다고 해봤는데 이게 맞나 싶다. Mockito만 좀더 파고들어가는 강의또한 들어봐야겠다 @WebMvcTest 일반적으로 사용하는 MVC 테스트용 어노테이션. MVC 관련 빈만 로드하기 때문에 전체 컨텍스트 필요없이 가볍게 테스트 할 수있다. (@Service, @Repository가 붙은 객체는 생성되지 않는다.) 분명 컨트롤러까지는 타는데 그 안에 있는 서비스는 진짜 무슨짓을 해도 안 타는 현상이 발생. 아예 실행조차 안되는게 이상하여 service, repository쪽에 뭔가 빠진게 있나 하고 거의 한시간 가량을 검토하고 트랜잭션 문제인가 싶어 이리저리 바꿔보고 해도 문제점을 찾지 못했다. 그러다 service에 있는 save 메소드 실행이 왜 안되지? 의 답이 서비스,메소드 자체의 문제가 아닌 다른곳에 문제가 있지 않을까? 로 변경. 바로 테스트 환경으로 눈을 돌렸는데 여기가 맞았다. 전체 환경을 테스트하는게 아니기 때문에 스프링 컨텍스트가 불필요하여 이 어노테이션 만으로 테스트 실행이 가능한 예외적인 어노테이션이다.사실 @WebMvcTest를 사용한 상태에서 @MockBean으로 서비스, 레포지토리 등록하여 사용할 수 있지만 스프링 3.2 버전부터 @Deprecated 😂 @AutoConfigureMockMvc MVC 자동 설정 담당. 컨트롤러 뿐만이 아니라 서비스, 레포지토리까지 테스트 할 때 사용 스프링 컨텍스트를 전부 로드한 후에 쓸수있는 어노테이션이기 때문에 @SpringBootTest 어노테이션으로 전체 환경 깔아놓은 후에 사용할 수 있다. @SpringBootTest 이 어노테이션은 지금까지 강의와 같이 실습해봤던 레포지토리 테스트, 서비스 테스트와 달리 실제 운영상황에서 사용될 클래스들 전부를 테스트 해보는 통합테스트 를 실행할 때 쓰는 어노테이션이다.애플리케이션 전체 컨텍스트를 로드한다 !!이걸로 바꾸니 드디어 정상적으로 실행되는 나의 API들 🤤테스트 완료 !!
백엔드
・
백엔드
・
스프링부트
2025. 03. 11.
0
[인프런 워밍업클럽 백엔드 3기] 2주차 발자국
💻강의 수강[실습] 데이터베이스 초기화[실습] 리포지토리 개발[실습] 리포지토리 테스트 코드 작성[실습] 리포지토리 성능 개선[실습] 클래스 생성[실습] DTO 개발[실습] 리포지토리 개발[실습] 서비스 개발[실습] 서비스 테스트 코드 작성[실습] 컨트롤러 개발[실습] 컨트롤러 테스트 코드 작성[실습] Thymeleaf - 부트스트랩 템플릿[실습] Thymeleaf - 템플릿 수정(index)[실습] Thymeleaf - 템플릿 수정(resume)[실습] Thymeleaf - 템플릿 수정(projects)[실습] Thymeleaf - 템플릿 수정(레이아웃)[실습] 인터셉터 개발 💻오류..[개발] 리포지토리 테스트코드 작성testFindAllByIsActive 테스트코드 실행 오류본 테스트코드 내부의 experiences의 size 값이 계속 0으로 나와 코드를 점검하였는데, Experience 엔터티의 addDetails 메소드의 매개변수명으로 details가 아닌 detail이 들어가 있어 함수 내부의 details와 매칭이 되지 않아 addDetails 함수가 제대로 작동하지 않았고, 그래서 Experience 배열의 한개의 Experience 인스턴스 아래의 ExperienceDetail 배열에 값이 추가되지 않았던 것이었다... 30분동안 이곳저곳 찾아보다가 도저히 찾지못해 멘붕 오기 직전 다시 한번 작성한 코드 전부를 단어 단위로 하나하나 꼼꼼하게 읽었는데, 저 곳에 s 하나가 빠져있던걸 깨닫고 벙쪘었다. 역시 개발자는 자나깨나 오타를 조심해야한다 💟미션이번주 과제는 본격 개발.. REST API 작성과 조회 API 구현이다 처음엔 분명 학생-소속학과-학과 이렇게 세 엔터티로만 할 예정이었는데.. 내가 학사 시스템에서 가장 많이 쓰는 수강신청 기능(개설강의조회, 신청, 삭제)을 구현하려다 보니 강의-수강강의가 필요했고 강의에 교수 정보도 들어가야 하니 교수 엔터티도 추가해야 했다. 이 시스템의 로그인을 생각하며 학생의 정보는 어느 시점에 들어가야하나? 를 고민했는데 보통 학생의 정보는 학생이 원서를 넣을때 거의 모든 정보가 들어간다는 걸 떠올리고 원서 테이블마저 만들게 되었다.😑원서 데이터가 학생 데이터로 옮기는 시점 또한 고민이 되었는데, 이 때문에 관리자 기능도 필수가 되었다. 원서를 조회하고 합격자(본격적으로 하려면 합격자 산정 로직을 넣어야 할 것 같은데 이건 이 미니미니 프로젝트를 사이드 사이즈로 키울 결심히 들 때..?)를 합격 상태로 바꿨을 때가 그 시점이다. 그리고 여기서 1안 2안이 나뉘는데, 우선 1안은 상태를 합격으로 바꾸면서 트랜잭션 처리 넣어 동시에 학생 테이블로 데이터가 옮겨진다. 그러면 학생이 합격자 발표 조회를 했을때 학생 테이블에 자기 정보가 있다면 합격 조회되고 put으로 비밀번호만 만들어서 로그인하기. 2안은 관리자는 원서 상태만 합격으로 바꾸고 학생이 합격자 발표 후 자기 원서의 상태가 합격이라면 그 때 비밀번호만 받으면서 학생 테이블에 원서 테이블의 모든 정보 옮겨적기 시점의 문제고 성능과 효율성은 분명 비슷할 것 같은데.. 이런 쓸데없는게 제일 고민된다. 😂😂이런 느낌이 되었다 이번주 너무 바빠서 관리자모드 - 강의 조회 하나를 겨우 만들었다. 자바만 쭉 쓰다가 오랜만에 정석으로 dto로 포장하고 jpa로 개발하려니 여기저기 실수가 많아 달랑 이거하는데 오류 잡느라 시간이 많이걸렸다 게다가 타임리프도 하도 오랜만에 쓰니 하나도 기억이 안나 강의 열심히 들으며 만들었다. css 너무 싫다 완성 화면은 이런 느낌....... 템플릿은 포트폴리오에서 쓴 거 재사용했다 ; admin 템플릿을 다 가져오기엔 너무 사이즈가 크고 그정도까진 사용되지 않기때문에 ; ; null은 교수아이디와 학과아이디인데 아직 강의에 학과, 교수 테이블 조인을 안걸어서 우선은 null로 처리함
백엔드
・
스프링부트
2025. 03. 09.
0
[인프런 워밍업클럽 백엔드 3기] 1주차 발자국
💚코프링 스터디: 자바만 쓰는 회사에 재직중이다 보니 스프링을 점점 까먹어 가는게 느껴졌다. 그러던 참에 인프런에 코프링 스터디가 열린다 하여 바로 신청했다.. 하기 잘한것같다. 💻강의 수강[이론] 스프링, 프레임워크, HTTP, REST API, 데이터베이스, JPA에 대한 기초 설명 면접 시즌때 열심히 공부했었던 내용이었는데 오랜만에 들으니 또 새로운 기분으로 듣게 된다. 반성합니다.[설계] 패키지 구조, 테이블 설계 [환경세팅] 개발 환경 세팅, 프로젝트 생성(Spring Initializer), GitHub 자바 21을 써보기 위해 최신 스프링 중 가장 안정적이라는 스프링 3.4.3을 선택했다[개발] 기본 클래스 생성, 엔티티 클래스 완성 사실 이번 스터디로 코틀린을 처음 써보는데, 자바랑 다른 점이 생각보다 훨씬 많아 아직 익숙해지는중이다. JPA 기능들도 거진 생각이 안나서 원투매니 열심히 뜯어보는중. 📖복습어노테이션 @PostConstruct이란?@Component, @Service, @Repository 같은 Spring Bean으로 관리되는 객체에서 사용 가능 의존성 주입이 완료된 후 실행됨애플리케이션이 시작될 때 한 번만 실행됨 주로 초기 설정, 데이터 로딩, 캐시 초기화 등에 사용됨 💟미션과제 주제로는, 멘토님의 예시 중에도 있으면서 요즘 내가 대학교를 새롭게 다니게 되며 거의 매일매일 수시로 쓰고있는 '학사 시스템'을 작게로나마 직접 설계해보면 좋지 않을까 해서 고르게 됐다. 깃허브 레포지토리에 프로젝트 올리기본 강의와 동일하게 세팅했다.깃허브 주소 : siirro/academic-info-system테이블 설계우선 가장 기본적인 학생과 학과 테이블을 만들었고, 그 다음으론 이 시스템에 수강신청 API를 만들어보면 좋을 것 같아 강의 테이블을 만들었다.학생과 학과는 다대다의 관계이므로 사이에 소속학과 테이블을 만들었고, 학생과 강의 역시 다대다 관계 이므로 사이에 수강강의 테이블을 만들어 다대다 관계를 해결하였다.교수 테이블은 강의 테이블에는 교수의 정보도 있다 보니, 교수의 정보 또한 보다 명확하게 관리하는 편이 좋을 것 같아 추가로 만들었다.
백엔드
・
스프링부트
・
코틀린
・
인프런백엔드스터디