본문 바로가기
개발자 일지/기타

[TIL]토이프로젝트 진행 학습내용 정리

by 네빌링 2022. 8. 15.
반응형

- 학습용 토이프로젝트 진행하며 알게된 점이나 어설프게 알았던 점 등을 정리해둔다.


1.토이프로젝트 시작 단계에서 흐지부지 되지 않기 위한 방어책

 

토이프로젝트를 시작하는 것은 쉽지 않은 것 같다(적어도 나는). 서비스를 만들려면 DB, 도메인 설계를 하고 어떤 기술을 사용할지 정하고 서비스 스토리보드를 만들어 퍼블구성을 하고..그러기 위해서 보통 팀단위로 많이 하기도 하는 것 같다.

 

내가 토이프로젝트를 시작하기 어려웠던 점은 위의 설계 단계가 너무 힘들었기 때문이다. 사실 코딩하고 직접 설정 만지면서 실습은 재밌지만, 설계 단계를 하다보면 이게 맞는지 틀린지도 잘 모르겠고 하다보니 질질 시간이 끌리고 흐지부지하게 된다. 이런 적이 몇 번 있었다.

 

인프런의 김영한 강사님이 학자형 개발자와 야생형 개발자가 있다고 말씀하셨다. 전자는 이론을 차곡차곡 학습하면서 개발에 적용하는 스타일, 후자는 일단 손으로 쳐보고 공부하는 스타일이라고 하셨다.

야생형 학습 방법이 더 학습효율이 좋다고 강조하셨고, 본인도 학자형이었는데 야생형으로 좀 바꾸셨다고 하신 게 기억나서 노력 중이다. 나는 MBTI때문인지 철저하게 학자형 학습을 해왔다. 요게 1~2년차까지는 나같은 비전공자들이 기반을 잡기는 좋은 것 같은데 최근 학습효율이 줄어든다는 느낌을 많이 받았다. 그래서 나도 야생형으로 좀 바꿔보려고 시작한 것 도 있다.

 

흐지부지 됨을 방지하기 위해 어쨋뜬 아래와 같은 마인드를 장착하고 시작했다.

 

  • 서비스 운영, 참신함 등을 일단 생각하지 말 것. 가능하면 학습 목적의 프로젝트.
  • 전체적이 설계가 많이 필요하지 않은 방식으로 시작. 오픈 API를 사용하든지, 간단한 서비스를 참고하여 핵심 기능 1~2개만 목표로 해볼 것.
  • 기술스펙도 너무 미리 생각하지 말 것. 프레임워크랑 언어 버전 + DB + @(vue.js 쓰든 스프링 시큐리티 쓰든 해보고 싶은거 1~2개) 정도의 스펙만 일단 생각할것. 그리고 살 붙여 나갈 것.
  • 틀리고 망가져야 배운다. 성격상 뭔가 흐트러지는 것이 불편해서 스스로 더 못 만지는게 있는 것 같은데 어차피 개발자는 스스로 흐트러뜨리고 수습하는 능력이 있어야 함. 틀릴 수록 기뻐하는 마인드를 갖춰야 함.

 

위와 같은 사고방식으로 시작하니 하루에 조금씩 하는 것에 부담이 없어졌다. 그리고 배워가는 게 확실히 있다고 느껴진다. 코딩을 학원에서 처음 시작하고 1달도 안되서 바로 취업하고 회사생활 개발만 하다보니 개인적으로 스스로 설계하고 구축하는 능력이 부족하다고 느낀다. 2년~3년차까지는 이론적 학습과 어떤 학습을 해도 조금씩 실력이 쌓이는 느낌이 있었는데, 어느 순간부터 정체된다는 느낌을 받았다. 그게 스스로 코딩하고 설계하고 구축하는 능력이 필요함을 알고는 있었지만 시작이 이상하게 쉽지 않았다.

 

아, 그리고 시작한 학습용 프로젝트 스펙 설정을 좀 구식과 신식 조합으로 잘못 짬뽕시켜서 고생중이다. 일단 지금 방식으로 계속 진행하는 것은 회사 프로젝트에 도움이 될 것 같긴한데.. 깊게 진행하는 것은 힘들 것 같아서 어느정도 기능 및 리펙토링 후 서버 배포 하고, 최신스펙 구조의 프로젝트로 넘어가봐야겠다.

 

2.학습내용 간단 정리

 

학습된 내용들을 간단히 정리하고 더 디테일하게 포스팅할 것들은 나중에 해봐야겠다.

 

1)mysql 커넥션 테스트시 에러

 

dataSource.getConnection() 테스트시 다음과 같은 에러가 발생했다.

Unknown system variable 'query_cache_size'

 

mysql-connector-java 라이브러리 의존시 내 mysql 버전과 맞지 않았다. 5에서 8.0.24로 변경해주었다.

 

[pom.xml 일부]

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.24</version>
</dependency>

 

2)인터셉터와 필터 차이점

 

요청 전에 가공해주기 위한 인터셉터 뼈대를 설정하면서 인터셉터 vs 필터에 대해 복습했다. 가장 큰 차이점은 필터의 경우 디스패처 서블릿에 요청 전달 전/후에 처리된다. 반면 인터셉터는 디스패처서블릿이 컨트롤러 요청 매핑하기 전 작동한다. 디스패처 서블릿이 스프링컨테이너 안에 존재하니 인터셉터도 스프링 컨테이너 안에서 작동한다. 

 

참고로 스프링 시큐리티는 필터단계에서 적용된다.

 

참고

https://mangkyu.tistory.com/173

 

3)xml 네임스페이스 관련

 

servlet-context.xml 등 설정시 xmlns(xml namespace) 뒤에 ':네임'이 되어 있는데 지워주면 1개의 디폴트 네임스페이스가 가능하다. 아래의 경우 xmlns:mvc를 xmlns로 디폴트 네임스페이스 변경하였다. 그래서 <mvc:annotation-driven>을 <annotation-driven>으로 바꿨다. 

 

[servlet-context.xml 일부]

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 어노테이션 매핑 방식 사용 설정 -->
    <annotation-driven/>
    
    <!-- 컴포넌트 스캔 대상 설정 -->
    <context:component-scan base-package="api.controller"/>
    <context:component-scan base-package="config"/>

	<!-- 생략 ... -->
</beans:beans>

xsi:schemaLocation은 내가 사용할 네임스페이스와 스키마파일(xsd)을 공백으로 구분하여 지정해준다. 

 

참고

https://cheershennah.tistory.com/83

 

 

4)pom.xml properties 속성

 

<properties>에 개발자 정의된 태그를 <dependency> 등에서 사용 가능하다. 아래에 <spring.security.version>으로 정의한 properties속성을 <dependency>에서 ${spring.security.version}으로 사용 가능하다.

 

[pom.xml 일부]

<properties>
    <java-version>1.8</java-version>
    <org.springframework-version>4.2.4.RELEASE</org.springframework-version>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spring.security.version>4.1.1.RELEASE</spring.security.version>
</properties>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${spring.security.version}</version>
</dependency>

 

참고

https://cornswrold.tistory.com/228

 

 

5)webapp 하위 index.jsp가 존재할 때..

 

webapp/index.jsp가 존재할 때, webapp/WEB-INF/index.jsp로 타도록 컨트롤러 매핑한 것이 타지 않았다. 생각해보니 컨트롤러 접근 전 직접 접근할 수 있는 존재가 있으면 그걸 탄다고 김영한님 강의 때 들었던 것 같아서 지워보니 접근 되었다.

 

6)DB관련 정리

 

운영 업무 하다보니 DB(MySQL)에 관해서 좀 세세한 부분까지 알아야겠다고 느꼈다. 쿼리날리고 테이블만드는 수준에만 그치면 안 될 것 같아서 찾다보니 생초보용 강좌가 있어서 빠른배속으로 들어보는 중..

 

정리한 것 간단 정리..

 

  • DBMS : DB 관리 시스템
  • DB는 MYSQL에서 스키마와 동일 용어(DB == 스키마)
  • MySQL 무료버전은 community 버전
  • MySQL 설치시 standalone, innoDB cluster 구분
  • MySQL cmd에서 설치경로(../bin) 이동하여 cmd 명령어 사용
    • show databases; 명령어 시 sakila, sys, world 등은 기본 DB
    • create databases show_db == create schema show_db
    • use show_db; 명령어 시 해당 디비 사용

 

참고

https://www.youtube.com/watch?v=EftIRlr6rPI&list=PLVsNizTWUw7GCfy5RH27cQL5MeKYnl8Pm&index=5

 

 

7)root-context.xml vs servlet-context.xml

 

요청과 관련된 처리, 뷰관련 처리(뷰리졸버), 인터셉터 등은 servlet-context.xml에서 처리한다. 반면 root-context.xml에서는 view와 관련되지 않은 Service, DAO, DB 등 비지니스 로직 관련 설정을 처리한다.

또한 root-context에 등록되는 빈들은 모든 컨텍스트에서 공유 가능하나, servlet-context에 등록되는 빈들은 해당 컨텍스트에서만 사용 가능하다.

 

참고

https://thiago6.tistory.com/70

 

8)깃허브 초록색 잔디밭이 설정 안 된 이유

 

예전부터 커밋을 할 때에도 잔디밭이 안 심어져서 '내가 코딩량이 부족한가보다ㅜㅜ' 하고 넘어갔는데 그게 아니었다. 

그냥 로컬환경의 git에 이메일 주소가 깃허브 이메일과 달라서였다..

 

https://wellbell.tistory.com/43

 

반응형