IoC(Inversion of Control)

 용어 그대로 코드의 로직이 일반적인 제어의 흐름이 아니라 역전된 것을 말한다. 일반적인 경우에는 메서드나 객체의 호출 작업을 개발자가 결정하였다. 예를 들어서 하나의 객체가 다른 객체를 사용하기 위해서 new로 객체를 생성하는 코드를 개발자가 직접 작성하는 경우들이라 보면 된다. 하지만 이것은 IoC에서 역된된다. new를 사용하지 않고 외부( like 스프링 )에서 객체를 생성하고 필요에 따라 넣어주는 방식으로 일반적인 제어의 흐름이 역전되버린다. 

 

이러한 제어의 역전의 장점으로는 객체간 결합도를 낮춰주며 코드의 변경이나 추가가 용이한 유연한 코드를 작성할 수 있도록 한다. 

 

DI(Dependency Injection)

스프링에서는 의존 관계 주입기능을 제공한다. 이것이 다른 프레임 워크와 차별화되는 특징 중 하나다. 간단하게 말하면 의존성 주입이라는 말은 사용하는 쪽에서 객체를 직접 생성해서 쓰는게 아니라 외부에서 생성해서 받아서 쓴다고 말하면 될 것이다. 이러한 DI라는 말은 디자인 패턴에서 나왔으며 두 객체간의 연관관계가 있는 경우 이것이 고정되는 것이 아니라 그 사이에 인터페이스를 두어서 필요에 따라 동적으로 관계를 주입하여 유연성을 확보하고 결합도를 낮추자는 철학에서 나온다. 

DI

  방법 1은 A 객체에서 B와 C를 직접 생성하는 방식을 사용하고 방법 2는 외부에서 생성된 객체를 setter() or 생성자를 통해 주입하는 방법을 사용한다. 방법1의 같은 경우에는 강한결합이 만들어져 유지보수가 어려워 진다. 이러한 강한 결합을 방법2의 방식으로 느슨한 결합으로 풀어내게 된다. 이 과정에서 다형성의 원리를 사용하여 기존 객체를 인터페이스를 구현하도록 변경하고 그 인터페이스를 매개변수로 받는 방식을 사용한다. 

 

방법1의 코드를 다음과 같이 정의하였다.

public class Store {

	private Apple apple;
    
    public Store() {
    	this.apple = new Apple();
    }
}

 방법2의 코드는 매개변수를 interface로 받아서 기존에 Store 객체와 Apple 객체의 결합도를 느슨하게 하고 대신 Interface와 결합하여 새로운 과일이 추가되는 경우에도 코드 유지보수가 용이하게 만든다. 이와 같은 경우 객체의 생성은 외부에서 일어나고 필요한 경우에 Fruit을 구현하는 새로운 과일 객체를 더 구현해도 된다. 이 때문에 Store 객체는 더이상 과일 객체 생성과 변경에 관여하지 않아도 된다. ( 암튼 매우 유연해진다는 말임.. )

public interface Fruit {}
public class Apple implements Fruit {}

public class Store{

	private Fruit fruit;
    
    public Store(Fruit fruit){
    	this.fruit = fruit;
    }

}

 

사실상 DI나 IoC나 비슷한 말이다. 스프링은 이러한 아이디어에 착한하여 프레임워크가 설계되었다. IoC 컨테이너 (혹은 DI 컨테이너)는 Bean이라는 것을 생성하고 관리한다. (이 Bean은 스프링에서의 객체를 의미한다. ) 이 컨테이너에는 굉장히 많은 Bean들이 있을 수 있으며, 이러한 Bean은 개발자가 필요한 경우 주입하여 사용한다. 즉 어떤 객체나 코드 영역에서 주입으로 인한 참조관계가 형성된다는 것이다. 그리고 개발자는 new 키워드를 사용한적 없이 단순히 외부에서 생성된 객체를 사용하는 것 뿐이다.

 

 하지만 이렇게 외부에서 객체를 생성하는데 객체를 계속 생성하고 소멸하면 아무리 GC가 성능이 좋다고 하더라고 부담이 될 수 있다. 이때 객체의 생성에는 인스턴스를 오직 하나만 생성하는 방식인 싱글턴 패턴이 적용될 수 있다.( 물론 설정에 따라 변경은 가능 )

 최근 들어서 느낀 것은 맨탈의 중요성을 많이 느낀다. 주변에 부정적인 사람이

 

있다면 내가 아무리 성숙해졌더라도 영향을 받는 것이 없지 않게 있다.

 

하물며 그 사람이 내 주변 사람이 아니더라도 어쩌다 모르게 그 이야기를 듣게 되는 경우도 있다. 

 

부정적인 감정을 컨트롤 하기에는 다양한 방법이 있다. 자신과 마음에 맞는 친구를 사귄다던가

 

아니면 자신과 맞지 않는 사람을 배척하거나 아니면 현실 도피하여 끝 없는 방황을 하다가 일을 

 

마무리하는 방법 등등.. 그리고 자신이 옳다는 것을 주변에게 설득하면서 자신을 정당화하는 방법 등...

 

그렇다면 부정의 반대인 단순 긍정의 태도로 일관되어야 하는 건가? 그것도 아니다.

 

일단은 어떻게서라든 결과물이란 것을 만들어야 한다. 그 과정에서 자신을 반성하고

 

그 과정을 기록하고 주변에 도움이 될만한 사람을 찾고 그 사람에게 조언을 구해고 

 

자신을 조금씩 교정하고 또 상담해야 한다.

 

제일 어리섞은 짓은 자신을 반성하지 않고 단순히 실패나 부진의 원인을 타인이나 환경탓으로 돌리는 사람들이다.

 

아무리 열악한 환경이라도 그 환경의 테두리 안에서 잘할 수 있는 방법이 있을 것이다.

 

그리고 아무리 자신이 싫어하는 사람이라도 그 사람에겐 배울점과 장점이 있을 것이다.

 

근데 이것도 어떻게 보면 긍정인데 단순한 긍정보단

 

인생의 깊은 고민과 결과물이 첨가된 긍정의 자세라 말하면 되겠다.

 

 

 

 

'회고록' 카테고리의 다른 글

포트폴리오 사이트 배포  (0) 2023.06.23
기술적인 고찰  (0) 2023.06.13
Git을 쓰면서 파일을 다 날릴 뻔 한 경우  (0) 2023.04.13
SQLD 합격 후기  (0) 2023.04.07
SQLD 자격 검정 시험 후기  (0) 2023.03.19

삽질했던 기억

 

최근에 구글 검색으로 스프링에서 모바일 페이지 지원이 가능한 라이브러리를 알게 되었다.

 

spring-mobile-device 라이브러리다. 사실 사용법도 구글링하면 잘 나와있다.

 

Maven repository에 검색하면 다음과 같이 나와있다.

 

maven 검색에서 나온 결과

1.1.5.RELEASE 버전이 뭔가 최신버전(?) 인 것 같다. 근데? 업데이트 날짜가 2015년이다.

 

내 프로젝트는 springframework-5.0.7 이다. 처음엔 1.1.5.RELEASE 버전으로 pom.xml 파일에 라이브러리를 추가하였다.

 

근데 뭐 아무리 해도 실행이 안된다.  필터 때문에 오류가 나는 것 같고 내부적으로도 뭔가 꼬이는 것 같아 보였다.

 

이럴 때는 프로젝트 내 target폴더를 지우고 .m2 폴더를 지우고 메이븐 reload를 진행해보고 라이브러리에 뭔가 문제가 있음을 확인했다.

 

github 검색으로도 뒤져보면 거의 대부분 springframework 3점대 버전으로만 적용된 프로젝트만 있었다.

 

이게 호환이 안되나 싶었다.

 

그러고나서 곰곰히 생각해보고 다시 메이븐으로 돌아와서 아래와 같이 컴파일 버전을 확인하였다. 3. 2.13 버전으로 컴파일 되었다는 것은 당연히 5점대에서는 돌아가지 않는다는 것이다. 어!? 그럼 어떡하지? 하던 중

버전이 안맞음..

잘 보니까 옆에 Spring Plugins 탭에 2.0.0.M3 버전이 하나 더 있었다. 뭔가 공식적인 버전 보다는 따로 github Repository에서 배포하는 듯했다.

찾았다. 이거다.!

 

컴파일 버전을 보니까 스프링 5점대에서 빌드가 된다.

자 그럼 내 프로젝트에 적용해보자

pom.xml에 의존성 추가

다음 dependency 태그를 pom.xml에 넣는다.

<dependency>
   <groupId>org.springframework.mobile</groupId>
   <artifactId>spring-mobile-device</artifactId>
   <version>2.0.0.M3</version>
</dependency>

pom.xml

하지만 이것만 넣어서는 maven이 다운받지 못한다. 이 파일은 repo에서 다운받는 것이므로 repo 주소까지 추가로 기입해야 한다. <repositories> 태그도 함께 넣어주자.

 

<repositories>
   <repository>
      <id>spring-milestones</id>
      <name>Spring Milestones</name>
      <url>https://repo.spring.io/libs-milestone</url>
      <snapshots>
         <enabled>false</enabled>
      </snapshots>
   </repository>
</repositories>

나는 pom.xml 파일 끝에 쪽에 넣어줬다.

 

web.xml에 필터 등록

해당 라이브러리는 필터기반의 방식으로 동작된다. 즉 해당 url에 들어오기전에 앞단 부분에서 처리된다고 보면 되는데

 

필터 등록은 보통 web.xml에서 한다. 아래와 같이 필터 등록을 해준다.

 

<filter>
   <filter-name>deviceResolverRequestFilter</filter-name>
   <filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>deviceResolverRequestFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

빈 등록

이제 servlet-context.xml 부분에 빈을 등록해주면 된다. "이건 인터셉터와 관련된 빈이야~" 라고 하는 태그를 같이 달아주는 것이다. 그냥 아래 부분을 중간쯤에 넣어주면 된다. 

<interceptors>
   <beans:bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor"></beans:bean>
</interceptors>

테스트

이제 테스트를 하는 코드를 작성해보자. 간단하게 기본코드 HomeController를 이용하였다. HttpServletRequest 객체를 받아서 DeviceUtils.getCurrentDevice() 메서드의 인자로 넣어주면 디바이스 정보가 객체에 기록된다. Device객체의 isMobile(), isTablet() 등으로 현재 사용하는 디바이스가 뭔지 알려준다. 

테스트

PC로 접속하면 다음과 같다. "Hello desktop user"를 출력하는 것을 확인할 수 있다. ( 이건 내 프로젝트 기본 셋팅 페이지이다. 이것저것 세팅 해논거... )

pc로 접속시

모바일로 접속하는 것을 테스트 하려면 아래의 크롬 확장 프로그램을 설치해주자 "User-Agent Switcher for Chrome"

https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg

이거 깔아야함

설치한 확장 프로그램을 크롬 주소창 옆에 고정한 후 안드로이드 화면으로 체크하고 열린 URL로 들어가보자

안드로이드로 체크

모바일로 접속했다는 것을 확인할 수 있다. 아직 모바일 페이지는 따로 제작하지 않았다. 검색한 결과 모바일인 경우 controller로 처리한 뷰 페이지를 따로 지정한 폴더쪽으로 매핑시킬 수 있다고 한다. 현재 진행하는 프로젝트에 이것을 적용할 예정이다.

모바일 이란 것을 인식해버림

내가 제작한 모바일 페이지를 보여주기

모바일 전용 페이지 제작

mobile 폴더에 모바일 전용 페이지인 home.jsp 파일을 만든다. 

모바일 전용 페이지

내용은 다음과 같다.

모바일 전용 페이지

servlet-context.xml 수정

InternalResourceViewResolver는 컨트롤러가 반환해주는 뷰 페이지에 대해서 prefix와 suffix를 붙여주는 역할을 한다. 이것을 spring-mobile-device의 LiteDeviceDelegatingViewResolver가 위임받아서 뷰페이지 앞에 prefix와 suffix를 붙여주는 일을 하는데 모바일 디바이스인 경우 views 폴더 아래 지정한 폴더이름을 붙여서 그 아래 있는 jsp페이지를 찾아 주게 된다. 기존에 세팅되었던 InternalResourceViewResolver에 대한 빈 등록 부분은 주석처리를 하고 아래 코드로 대체한다.

아래 예제는 "mobile/"이라고 붙였으니 views/mobile/home.jsp 경로로 매핑되는 뷰를 볼 수 있다.

servlet-context.xml 설정

User-Agent Switcher for Chrome 안드로이드 환경으로 접속한 상태

안드로이드로 들어간 상태

 

 

사실 여기서 다루지 않은 spring-mobile-device의 SitePreferenceWebArgumentResolver는 아래 링크에서 참고하길 바란다. 이 객체로 사용자는 모바일 유저인데도 본인이 선호하는 PC 전용 사이트로 이동하는 것을 지시할 수 있다. 또한 m.google.com  형식과 같이 다른 도메인으로 보내는 방식도 이와 관련되어 있다. 

 

관련 출처 

http://arahansa.github.io/docs_spring/device.html

http://web.archive.org/web/20150525062736/http://projects.spring.io/spring-mobile/

https://docs.spring.io/spring-mobile/docs/current/reference/html/device.html

 

결론 > 스프링 5점대 버전은 spring-mobile-device 2.0.0.M3을 써야 한다.

Maven repository에서 스프링 컴파일 버전을 확인하는 습관을 갖자. 

 

 

'스프링(부트아님ㅋ)' 카테고리의 다른 글

DispatcherServlet 정리  (0) 2023.07.16
Spring 애너테이션 몇 가지 정리  (0) 2023.05.14
스프링 IoC + DI  (0) 2023.05.05

내가 작성한 소스 코드를 github 원격 저장소에 업로드 하고 싶은 상황이 온다. 처음에 git 공부를 하다보면 디테일한 상황을 고려하지 않게 되는데 이게 실전에 다가오면 원격 저장소 상태나, 로컬 저장소 상태 등에 따라서 상황이 구분이 되고 막상 업로드 하려고 하면 딱히 방법이 떠오르지 않는다. 그래서 3가지 경우의 수 정리해보았다.

 

1. 로컬에서 작업을 주욱 하다가~ Readme.md 파일을 생성하지 않은 원격 저장소에 소스코드를 업로드 하는 경우
2. 이미 만들어진 https 주소를 복사하여 clone 후 로컬에서 작성중인 소스코드를 원격 저장소에 업로드 하는 경우
3. 이전에 생성한 원격 저장소에 이미 Readme.md 파일이 있는 경우 내가 작업했던 로컬 작업영역 내용을 원격에 업로드 하는 경우

 

1. 로컬에서 작업을 주욱 하다가~ Readme.md 파일을 생성하지 않은 원격 저장소에 소스코드를 업로드하는 상황

로컬에 작업을 진행하고 커밋

 

일단 로컬에서 저장소를 만들어서 다음과 같이 파일을 만들고 add 후 commit하여 작업이 끝났다고 가정하자.

Add a README file을 체크하지 않고 git repository를 생성

 

미리 만들어 놓은 git repository가 떠올랐고 여기엔 readme.md 파일이 없다.

> $ git remote add origin "생성한 git repository의 https 주소" : 원격 저장소의 주소를 지정

git remote add 명령어 실행화면

> $ git remote -v : 등록된 원격 저장소 주소 확인

 

등록된 원격 저장소 주소

 

> $ git push -u origin main : -u라는 옵션은 --set-upstream 옵션과 동일하다. 특정 브렌치를 지정해서 업로드를 위한 길을 지정하는 작업이라고 보면 된다. 길을 지정하면 그 브렌치로 소스 코드가 업로드 된다. ( 이 옵션 지정 없이 push 명령어를 입력하게 되면 git push --set\-upstream origin main이라는 에러 문구가 뜬다. )

 

                                   

 

 

원격 저장소에 소스 코드가 업로드 되었다.

소스 코드가 업로드된 상황

2. 이미 만들어진 https 주소를 복사하여 clone 후 로컬에서 작성중인 소스코드를 원격 저장소에 업로드 하는 경우 (이 때는 Readme.md 파일 생성여부 상관없음)

 

HTTPS 주소

 

이미 만들어 놓은 git repository의 원격 저장소의 https 주소를 복사

clone 명령어 실행

> git clone "git repository의 https주소" : clone은 원격의 저장소를 로컬에다 복제를 하는 것이라 보면 된다.

  결과적으로 현재 디렉토리에 원격 저장소 폴더가 생기고 그 안으로 이동한다.

clone 이후 상황

해당 폴더에 들어가니 branch문구가 찍히고 현재 디렉토리에 원격의 파일이 들어왔다.

git remote -v 실행결과

git clone을 하는 경우에는 remote 주소가 자동으로 지정된다.

그리고 이상황에서 파일을 새로 추가 혹은 변경 등의 작업이 일어난다고 가정하자.

작업을 한 상황

> git push origin main : clone을 한 상황에서는 set-upstream을 따로 지정하지 않아도 된다.

바로 git push origin main으로 소스코드 업로드 가능

 

원격 저장소에 업로드
업로드된 결과

 

3. 이전에 생성한 원격 저장소에 이미 Readme.md 파일이 있는 경우 내가 평소에 작업했던 로컬 작업영역 내용을 원격에 업로드 하는 경우

 

새 저장소 생성

이 경우에는 이전에 원격 저장소를 만들어놨는데 README.md 파일이 있는 경우이다.

로컬에서 작업을 완료함

그리고 로컬에서 다음과 같이 작업을 완료했다고 가정하자

이 때 위의 1번의 방법과 같이 업로드 하려하는 경우 다음과 같이 된다.

에러

error : failed to push some refs to "주소~" 라는 에러가 난다. 이러한 이유는 원격 저장소에 README.md 파일이 존재해서 그렇다. README.md 파일이 없는 경우 로컬에 있는 소스코드만 원격으로 들이밀면 되나, README.md 파일이 있기에 이것으로 인해 로컬 저장소가 예상한 것과 원격 저장소의 상태의 불일치가 발생한다.

그래서 로컬 저장소는 "이거 혹시 원격 저장소에 누가 push 한거 아니야?" 라고도 생각할 수 있는 것이다.

 

해결 방법은 두가지다.

1) git push -f origin main ( -f 옵션을 이용한 강제 푸시방법 )

2) git pull origin main --allow-unrelated-histories

1번 방법은 뭔가의 불일치 느낌이 있어도 억지로 밀어 넣겠다라는 뜻이고

2번 방법은 --allow-unrelated-histories 옵션 설정으로 pull하여 원격 저장소의 변경사항을 가져오고 로컬 저장소에 merge도 시키겠다는 말( pull은 merge 과정이 포함한다. 주의!!)

 

1번의 방법

먼저 1번의 방법으로 강제로 업로드 시켜본다. 결과는 README.md 파일이 없어진다. 만약에 README.md에 뭔가 중요한 내용이 있었더라면 이거 큰 일이다...

Readme.md 파일 어디감??

음.. 이번엔 시간을 과거로 되돌려서 이제 2번 방법으로 해보자 ( 앞 과정 똑같이 셋팅 )

원격 저장소 등록

> git remote add origin "원격 저장소 주소"

> git pull origin main --allow-unrelated-histories

앞의 명령어를 실행시킨 결과 Merge 메세지를 작성하는 창이 나오고

결국엔 Merge가 된다. 원격 저장소의 Readme.md 파일이 로컬 저장소로 들어와 merge된 것이다.

readme.md 어서오고

 

readme.md 어서오고

이제 다시 원격 저장소로 push 명령어 실행

 

readme.md파일이 원격 저장소에?

readme.md파일이 사라지지 않고 원격 저장소에 들어온다.

이는 readme.md 파일을 로컬로 가져오고 상태를 맞춰주고 push를 했기 때문에 그렇다.

강제 push 방법인 1번 방법도 많이 쓰는 방법이기도 하지만 Readme.md 파일에 뭔가 써놓은게 많아서 날라가는 것을 원치 않는 경우에는 2번 방법을 써주자.

'Git & Github' 카테고리의 다른 글

커밋로그를 바꿀 수 있는 git rebase  (0) 2023.07.17
프로젝트의 시작은 .gitignore부터..  (0) 2023.07.17

어느정도 git을 다루는데 숙달되었다고 느꼈지만  필기한 파일을 모조리 다 날릴뻔 했다. 기존에 작업하면 이클립스 프로젝트를 git으로 연동하였다. 이전에 해봤던 기억이 있어서 이클립스 프로젝트를 git 저장소와 연동하면 자동으로 .gitignore 파일이 생성되고 변경 사항에 숨김파일과 설정파일 등 잡다한 파일이 들어오지 않을 줄 알았다.. 그런데 add 하려니까 잡다한 파일이 너무 많았고 아무 생각없이 전체다 stage에 올려버렸다. 이럴 때 add를 취소하는 방법이 "git reset --hard지" 라면서 자신있게 입력한 것이 작업한 내용을 전부 날리게 만들었다. 이전에 커밋한 이력이 한번도 없으니 reflog로도 복구를 하지 못한다... 총체적 난국이었으나 ... 구글링으로 파일 복구 S/W를 다운받고 날아간 파일 검색을 하였더니 다행히도 이클립스와 관련된 백업 파일을 저장하는 폴더에 대략 80퍼센트의 파일들이 있었고 다행히도 복구할 수 있었다.. 나도 모르게 어딘가에선 백업본을 저장하는 폴더가 있었다는게 다행이었다. 대략 20퍼센트의 날아간 파일은 vscode에 열려있는 창으로 어찌저찌 복구는 되었다. 새로 만든 프로젝트에는 .gitignore를 직접 작성하였다. 이런 경험이 갑자기 생기니까 .gitignore 작성법도 검색해보고 관련 명령어도 추가로 공부하게 되었다. 그리고 항상 백업본을 미리 만들어놔서 이런 일에 쉽게 대처할 수 있도록 해야겠다는 생각을 하였고 Git을 다룰 땐 조심히 다뤄야 겠다고 느꼈다..

 

추가) 실수로 add해서 Staging area에  올라간 파일들을 다시 내릴 땐 git reset HEAD . 명령어를 사용할 것!, git reset --hard 명령어는 파일 분실우려가 있기에 위험하다.!

 

 

 

'회고록' 카테고리의 다른 글

포트폴리오 사이트 배포  (0) 2023.06.23
기술적인 고찰  (0) 2023.06.13
최근 고찰  (0) 2023.05.03
SQLD 합격 후기  (0) 2023.04.07
SQLD 자격 검정 시험 후기  (0) 2023.03.19

SQLD 사전점수

 

 4월 7일 SQLD 사전 점수가 나왔다. 예상보다 낮게 점수가 나오긴 했지만 노랭이 한권 + 기출 1~2회 푼거 치고는 나쁘진 않다. 시간이 조금은 걸렸지만 덕분에 데이터베이스 프로젝트 할 때 많은 도움이 됬다. 모델링 설계 방법도 이제는 눈에 쉽게 보인다. 이제 sqld+정처기 조합이 완성되었는데 2차 프로젝트도 끝나버려서 주말은 이제 널널하다. 스프링과 스프링부트를 슬슬 시작할 때가 온 것 같다. 다음주 부터는 프론트 엔드쪽 진도를 나간다. 뭐 볼만한 강의가 없나 ? 뭔가 한달이라는 시간동안 데이터베이스를 배우는데만 많은 힘을 들였다. 후련하긴하다. 

'회고록' 카테고리의 다른 글

포트폴리오 사이트 배포  (0) 2023.06.23
기술적인 고찰  (0) 2023.06.13
최근 고찰  (0) 2023.05.03
Git을 쓰면서 파일을 다 날릴 뻔 한 경우  (0) 2023.04.13
SQLD 자격 검정 시험 후기  (0) 2023.03.19

 오늘 sqld 시험을 보고 왔다. 토요일 하루를 풀로 비워두고 오로지 sqld 기출 문제를 풀고 개념을 암기 하는데만 전념했다.오랜만에 느껴보는 긴장감과 초조함이었다. 학부 때 데이터베이스를 배웠지만 몇년을 쉬고 다시 공부하기란 쉽지 않았다. 운이 좋게도 유튜브에 국민대학교 김남규 교수님이 열어주신 강의를 발견해서 이론적인 부분을 공부할 수 있었다. 어떤 추천 알고리즘이 나를 어떻게 그 강의로 이끌어 준건지는 모르겠지만 사실 그전에 이걸 어떻게 공부해야하나 걱정은 많았다. 다른 블로그에서 시험후기를 보니까 따로 공부를 안하고 요약 노트를 보았다고 하는데 커트라인 60점만 넘어도 된다고 그렇게까지 가볍게 공부할 생각은 없었다. 평소에 백엔드쪽으로 가고 싶었고 JPA 쪽을 공부하려면 데이터베이스 개념과 쿼리쪽을 제대로 알아야 한다는 얘기가 있었으니 뭔가 전공과목 배우듯이 제대로 공부하고 싶었다. 

 

수강했던 강의

  https://www.youtube.com/watch?v=TThEOiEbok0&list=PLg_wJlcMiuKtGdlIaAZ0rOPPQuTDENnEQ&index=4

해당 채널 개설강의들

 

 내가 유튜브에서 찾았던 강의는 데이터베이스실무라는 제목으로 올라온 강의들이었다. 평소에 이것저것 유튜브 영상을 생각없이 보다가 알고 보니 이게 sqld 자격증 시험을 위한 강의라는 것을 채널 재생목록 끝부분 영상을 보니까 알게 되었다. 강의에선 오라클 툴 사용법도 잘 다뤄주시고 실습자료도 오픈 되어있고 문제 출제 기관에서 만든 SQL 전문가이드 책을 기반으로 강의자료도 구성해주셨다. 강의는 나름 길었지만 이론적인 부분을 정말 깔끔하게 잘 알려주시고 총 12강 정도 들었던 걸로 기억나는데 어떤 강의는 4시간 짜리도 있어서 정말 빠른 배속으로 들었다. 이걸 다 듣는데 거의 일주일? 정도 걸렸다.근데 사실 중간에 프로젝트를 시작하느라 거의 마지막 강의를 일주일만에서야 다시 듣고 완강을 했다. 프로젝트 때는 진짜 다른 일정 다 올스탑이었다. 화요일날 프로젝트가 끝나고 기출문제 푸는거부터 거의 제대로 공부시작한 것은 수요일부터다. 

 

기출문제집

 

노랭이책

 기출문제집 책은 그 유명하다는 노랭이책을 샀다. 시험을 본 후에 느끼는 것이지만 최고의 선택이라 생각한다. 문제는 대략 200문제 가량 되고 여기서 시험문제에 그대로 나온 것이 한 2~30퍼센트 정도 된다. 데이터베이스실무 강의에 다뤄주는 내용으로도 충분히 풀 수 있는 문제도 있었지만 조금 지협적인 내용을 다루는 기출문제도 있었고 기본 원리를 살짝 꼬아서 출제되는 문제도 많았다. 그렇다보니 처음에 혼자 문제를 풀 때는 막히는 것이 많아서 다른 유튜브 강의를 참고했었다. 문제풀이 강의도 유튜브를 잘 찾아보면 아래 링크에서 확인할 수 있다. 두 분의 강좌가 있었는데 어쩌다DBA님이 올려주신 강의는 직접 쿼리를 입력해서 동작과정을 같이 설명해주셨고 전광철님의 강의는 약간 직관적으로 문제를 풀어주시는데 어떤 문제풀이는 전광철님 것이 좋았고 어떤 풀이는 어쩌다DBA님 것이 좋아서 거의 번갈아가면서 보았다. 강의를 보던 혼자 답지를 보면서 공부를 하던 이렇게 노랭이 기출문제를 다풀고 시험전까지 딱 3회독 정도 하면 충분하다고 생각한다.

 

문제풀이 강의

 

https://www.youtube.com/@opportunelydba

https://www.youtube.com/@ocp396

 

전광철 OCP

SQL자격검정 실전문제 풀이는 물론 SQL 학습과 관련한 채널입니다. 특히, SQLD,SQLP 자격을 위한 시험 준비를 위해 "SQL 자격검정 실전문제 - 한국 데이터진흥원"를 교재로 채택했습니다. 🔔 1과목(플

www.youtube.com

 

그 외 기출

 그런데 노랭이 200문제만 봐도 합격할 수 있을까? 나의 대답은 yes다. 하지만 고득점을 위해서라면 No이다. 고득점을 맞고 싶다면 여기서 추가로 기출을 봐야 한다. 나는 최근 기출 + 복원 문제를 추가적으로 찾아보았다. 출제되는 문제는 거의 기존 기출변형의 형태로 나온다. 아래의 사이트에서 45회, 37회 기출만 1~50번까지 풀어보았고 나머지는 1~10번 문제만 풀어보았다. 노랭이 책에서 안나오고 최근 기출에서 비슷하게 나온게 거의 5문제 정도되었다. 문제 구성이 막 고난도의 쿼리를 묻는 것보단 그냥 나오는 유형에서 돌려서 나오는 것이라 이걸 공부했다고 쿼리를 잘 짠다고는 얘기를 못하겠다. 그래서 현업에서 많이 안쳐주는 것도 있지만 ...

 

https://yunamom.tistory.com/category/%EC%9E%90%EA%B2%A9%EC%A6%9D/SQLD%20%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C

 

'자격증/SQLD 기출문제' 카테고리의 글 목록

JAVA 와 SQL 을 공부하고 있습니다.

yunamom.tistory.com

 위의 사이트들 말고도 데이터 전문가 포럼이라는 네이버 카페도 있다. 이곳이 사실상 본진이다. 가채점 정보도 주고 받을 수 있고 실시간 질문글을 올리면 유동 방문자가 많아서 빠르게 댓글을 달아준다. 시험을 응시하는 사람들에겐 꼭 알아둬야 하는 사이트이다. 

 

커뮤니티

데이터 전문가 포럼 (빅데이터분석기사, ADP, SQLP, DAP 등) : 네이버 카페 (naver.com)

 

데이터 전문가 포럼 (빅데이터분석기사... : 네이버 카페

빅데이터분석기사, ADP, ADsP, SQLP, SQLD, DAP, DAsP, 자격증 취득 등 데이터 전문가 커뮤니티입니다.

cafe.naver.com

 시험이 종료되고 집에 가벼운 발걸음으로 올 수 있었다. 가채점 답안을 확인하고 이상한 문제들이 있어서 혼란스럽기도 했지만 문제 난이도는 그렇게 높지 않다. 어느정도 대충 다푼거 같으면 붙은거라고 확신할 수 있다. 단지 나는 데이터베이스 개념을 다시 한번 보고 싶었던 것이 이 자격증을 따는 목표였다. 그리고 이것이 앞으로 하게 될 2차 프로젝트와 JPA 공부에 많은 도움이 되었으면 좋겠다. 큰 계획 하나가 갑자기 끝나서 일정이 널널해진 느낌인데 이제 남궁성 선생님 스프링의 정석 강의 마무리하고 김영한 선생님 풀커리를 듣고 포트폴리오 만드는데 나머지 시간을 보내면 될 것 같다.

'회고록' 카테고리의 다른 글

포트폴리오 사이트 배포  (0) 2023.06.23
기술적인 고찰  (0) 2023.06.13
최근 고찰  (0) 2023.05.03
Git을 쓰면서 파일을 다 날릴 뻔 한 경우  (0) 2023.04.13
SQLD 합격 후기  (0) 2023.04.07

 

 김영한 선생님 스프링 부트 강의를 따라하던차 무언가 에러가 났다. 프로젝트를 생성하고 막 서버를 열자마자 위와 같은 에러가 떴다. 음... 구글링 해보니까 8080 포트에 뭔가 떠있다고 한다.

 

곰곰히 생각해보니 8080에 Oracle 서버가 떠있었던것 같다. 뭐 그래서 가볍게 관리자 권한으로 cmd를 열고 netstat -ano | findstr 8080으로 해당 포트를 사용하는 프로세스를 찾고 taskkill /f /pid <해당pid>를 입력해서 가볍게 지워줬다.

 

 

 

 

이제 좀 서버가 열리나 했더니 No active profile set, falling back to 1 default profile: "default"라 뜨더니 또 서버가 안열린다. 하.. 프로젝트를 다시 깔아도 안된다. 뭔 짓을 해도 안되네?

 

 

하... 구글링좀 더 하다가  "build.gradle에 org.springframework.boot:spring-boot-starter-web"을 추가하고

 

 

 

여기서 Reload Gradle Project 했더니 뭐지 갑자기 해결된다. 

 

(* 사실 이와 같은 에러가 뜬 이유는 스프링 부트 설치시에 ADD Dependencies에 스프링 웹을 추가하지 않아서 일어난 문제였다. 사실 강의를 들은지 오래된 상태에서 이걸 복기하는지라 이걸 추가하는지 몰랐던거다.  )

 

 

다행히도 서버가 열렸다. 이번엔 8080으로 열렸다.

 

 

그리고 혹시 몰라서 이젠 오라클 서버 포트번호까지 바꿔주었다. 관리자 계정으로 접속해서 

1. SELECT DBMS_XDB.GETHTTPPORT() FROM DUAL; 을 입력해서 현제 port 번호 확인

2. EXEC DBMS_XDB.SETHTTPPORT(원하는포트번호); 라고 입력해주면 끝

 

 

+ Recent posts