Preface
며칠 전 친구와 이야기를 하던 도중 문득 내가 백엔드 개발자의 역할도 정확히 모르면서 무작정 공부를 하고 있다는 것을 깨달았다.
프로그래밍 언어를 통해 어떻게 서버를 구축한다는 것인지, 웹 서버를 구축하고 운영하기 위해 필요한 기본적인 기술엔 무엇이 있는지, 알고리즘을 배워서 어떻게 사용한다는 것인지 등 개발의 근본이 되는 질문에도 명쾌히 대답할 수 없었다.
지금 생각해보면 우선 간단한 프로그램을 개발해보며 나에게 부족한 것, 현재 상태에서 가장 필요한 것 등을 직접 느낀 후 공부 계획을 세우는 것이 당연한데,
나는 지금껏 주변에서 중요하다고 말하는 것, 유튜브에서 꼭 배워야 한다고 광고하는 것 등을 무작정 선택해 공부했던 것 같다.
내가 전공자도 아닐 뿐더러 졸업 후 최대한 빨리 취직하려면 가능한 다양한 기술을 익혀야 한다는 불안감에 사로잡혀 본질을 놓치고 숲이 아닌 한 그루 한 그루의 나무에만 집중하고 있던 것이 아닐까 싶다.
조금 늦은 감이 있지만 지금이라도 데이터베이스를 연동하여 작동하는 게시판을 제작해 볼 생각이다.
가능하면 도메인도 발급받아 로컬에서만 작동하는 코드가 아닌 주소만 입력하면 누구든 볼 수 있는 웹 서버를 구축해 보려고 한다.
게시판 개발을 마친 후엔 생활코딩의 Web강의를 보고, 다시 책으로 돌아와 Java, JSP, Spring, Linux 순으로 공부할 계획이다.
물론 공부 도중 우선순위가 바뀔 수도 있다.
서두르지 말고 나에게 정말 필요한 기술들을 선별하여 차근차근 습득한다면 제멋대로 흩어져 있던 지식들이 제 자리를 찾아 작은 충격엔 꿈쩍도 하지 않는 견고한 탑을 쌓을 수 있을 것이라 생각한다.
라고 말은 했지만, 사실 요즘 내 공부 방법에 회의감이 든다.
나는 어렸을 때부터 지금까지 무슨 일을 하던 근간이 되는 부분을 탄탄히 다지지 않으면 결국 이도 저도 아니게 된다는 생각을 갖고 살았기 때문에 항상 기본기를 제일 중요하게 여겼다.
개발 분야에서도 기본기만 확실히 잡고 가면 다양한 기술로의 확장성도 뛰어날 것이라고 생각해 소프트웨어 공학, OS, Python, DB, Java 등 모든 기술을 공부할 때 언제나 기본서를 구매해 정독하며 공부했다.
그러나 이렇게 밑바닥부터 하나씩 쌓아올리는 공부 방법은 시간도 오래 걸릴 뿐더러 실력이 향상되는 속도도 굉장히 더디다.
현직 개발자로 재직중인 친구가 이런 말을 했었다.
"너처럼 새로운 기술을 배울 때 책부터 사서 공부하는 습관이 있으면 실무에서 급히 새로운 기술을 사용해야 할 땐 어떻게 할 것이냐, 잠시만 기다려 달라고, 책좀 사서 보고 오겠다고 할거냐.
개발자는 배워야 할 것도 많고 정해진 기간 내에 아웃풋을 산출해야 하는 직업이다.
니가 모르는 것이라도 상황에 따라 구글링을 하며 그 때 그 때 필요한 기술을 사용할 수 있는 능력이 필요하다.
니가 언제까지 매일 하루 몇 시간씩 책을 보며 공부할 수 있을 것 같냐.
책에만 의존하면 너는 어떤 회사에서든 분명 실적이 제일 안 좋은 직원이 될 것이다.
물론 시간이 많이 지나면 너의 방법이 빛을 보고 그 능력을 인정받을 수도 있다.
그러나 다른 동료 개발자들은 처음부터 인정받고 시간이 지나면 더 높은 곳으로 가 있을 텐데, 니가 거기서 오는 상대적 박탈감을 감당할 자신이 있냐. 공부 방법을 조금 바꿔 보는 것은 어떨지 생각을 한번 해 봐라."
이 말을 듣고 내가 추구하는 방법이 정말 틀린 것인지, 내가 말하는 개발자의 기본기란 과연 어디까지인지, 친구가 말하는 공부 방식은 일정 수준까지 도달한 상태에서나 의미 있는 것이 아닌지 등 정말 많은 생각을 했다.
물론 나의 방식이 틀렸다면 언제든 변화를 줄 의향이 있다.
어쩌면 정직한 사람은 바보가 되는 세상에서 곧 죽어도 FM대로 공부하는 사람이 뒤쳐지는 것은 당연한 결과일 수도 있다.
다만, 섣불리 판단하기 보단 변화를 줄 시기를 적절히 선택할 수 있도록 충분히 고민할 시간이 필요할 것 같다.
현재 상태에서 내가 생각하는 백엔드 개발자의 기본기는 Java, JSP, Spring, SQL 정도이다.
기초적인 CS 지식과 DB 등은 이미 공부했으므로 적어도 Spring까지는 제대로 된 책을 보며 차근차근 공부하고 싶다.
아직 시간이 있으니 다양한 가능성을 열어둔 채로 천천히 생각해보자.
이번 내용은 클래스의 마지막 부분에서 다뤘던 내용이지만, 따로 업로드하는 것이 좋을 것 같다고 생각하여 지난 글에선 생략했었다.
자바의 기초적인 내용을 다룰 땐 어노테이션이 크게 중요하지 않지만, 이후 프레임워크를 사용할 때 자주 등장한다고 하니 기본 개념을 확실히 잡아두고 가자.
아 그리고 아직 중간고사가 기간이라 개발 공부에 시간을 많이 투자할 수 없어 내일은 일단 맥북에서의 게시판 개발 환경만 세팅해 둘 계획이다.
2. 어노테이션
- 어노테이션(annotation): 메타데이터
1) 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공
2) 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
3) 실행 시 특정 기능을 실행하도록 정보를 제공
- 어노테이션 정의
public @interface AnnotationName {
}
- 정의한 어노테이션 사용 방법
@AnnotationName
- 어노테이션은 엘리먼트(element)를 멤버로 가질 수 있다.
1) 각 엘리먼트는 타입과 이름으로 구성되며, 디폴트 값을 가질 수 있다.
2) 엘리먼트: 어노테이션을 코드에 적용할 때 외부의 값을 입력받을 수 있게 해주는 매개체
- 엘리먼트 선언 방법
1) 엘리먼트의 이름 뒤에는 메소드를 작성하는 것처럼 ( )를 붙여야 한다.
public @interface AnnotationName {
타입 elementName() [default 값]; // 엘리먼트 선언
}
- 엘리먼트를 선언하고 사용하는 예시
→ 디폴트 값이 없는 엘리먼트는 반드시 값을 기술해야 한다.
public @interface AnnoationName {
String elementName1();
int elementName2() default 5;
}
// 어노테이션을 코드에서 적용
@AnnotationName(elementName1="값", elementName2=3);
or
@AnnotationName(elementName1="값");
- 어노테이션은 기본 엘리먼트인 value를 가질 수 있다.
→ Value 엘리먼트를 가진 어노테이션을 코드에 적용할 땐 값만 기술할 수 있다.
public @interface AnnoationName {
String Value(); // 기본 엘리먼트 선언
int elementName2() default 5;
}
- 어노테이션을 적용할 수 있는 대상: java.lang.annotation.ElementType 열거 상수로 정의되어 있다.
ElementType 열거 상수 | 적용 대상 |
TYPE | 클래스, 인터페이스, 열거 타입 |
ANNOTATION_TYPE | 어노테이션 |
FIELD | 필드 |
CONSTRUCTOR | 생성자 |
METHOD | 메소드 |
LOCAL_VARIABLE | 로컬 변수 |
PACKAGE | 패키지 |
- 어노테이션이 적용될 대상을 지정할 땐 @Target 어노테이션을 사용한다.
→ @Target의 기본 엘리먼트인 value는 ElementType 배열을 값으로 가진다.
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Annotation {
}
- 어노테이션 정의 시 사용 용도에 따라 @AnnotationName을 어느 범위까지 유지할 것인지 지정해야 한다.
1) 어노테이션 유지 정책: java.lang.annotation.RetentionPolicy 열거 상수로 정의
2) 리플렉션: 런타임 시에 클래스의 메타 정보를 얻는 기능
RetentionPolicy 열거 상수 | 설명 |
SOURCE | 소스상에서만 어노테이션 정보를 유지 |
CLASS | 바이트 코드 파일까지 어노테이션 정보를 유지 |
RUNTIME | 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임 시에 어노테이션 정보를 얻을 수 있다. |
- 어노테이션 유지 정책을 지정할 땐 @Retention 어노테이션을 사용한다.
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {
}
- 런타임 시 클래스에 적용된 어노테이션 정보를 얻으려면 java.lang.Class를 이용하면 되지만, 필드, 생성자, 메소드에 적용된 어노테이션 정보를 얻으려면 Class의 메소드를 통해 java.lang.reflect 패키지의 Field, Constructor, Method 타입의 배열을 얻어야 한다.
리턴 타입 | 메소드명(매개 변수) | 설명 |
Field[ ] | getFields( ) | 필드 정보를 Field 배열로 리턴 |
Constructor[ ] | getConstructors( ) | 생성자 정보를 Constructor 배열로 리턴 |
Method[ ] | getDeclaredMethods( ) | 메소드 정보를 Method 배열로 리턴 |
리턴 타입 | 메소드명(매개 변수) |
boolean | isAnnotationPresent(Class<? extends Annotation> annotaitonClass |
지정한 어노테이션이 적용되었는지 여부. Class에서 호출했을 때 상위 클래스에 적용된 경우에도 true를 리턴한다. | |
Annotation | getAnnotation(Class<T> annotationCalss) |
지정한 어노테이션이 적용되어 있으면 어노테이션을 리턴하고 그렇지 않다면 null을 리턴한다. Class에서 호출했을 때 상위 클래스에 적용된 경우에도 어노테이션을 리턴한다. | |
Annotation[ ] | getAnnotations( ) |
적용된 모든 어노테이션을 리턴한다. Class에서 호출했을 때 상위 클래스에 적용된 어노테이션도 모두 포함한다. 적용된 어노테이션이 없을 경우 길이가 0인 배열을 리턴한다. | |
Annotation[ ] | getDeclaredAnnotations( ) |
직접 적용된 모든 어노테이션을 리턴한다. Class에서 호출했을 때 상위 클래스에 적용된 어노테이션은 포함되지 않는다. |
'Java > 이것이 자바다' 카테고리의 다른 글
이자바 5장(참조 타입) 확인문제 (0) | 2022.11.23 |
---|---|
이자바 4장(조건문과 반복문) 확인문제 (0) | 2022.11.23 |
클래스 (2) | 2022.10.13 |
타입 변환 메소드 (2) | 2022.10.07 |
참조 타입 (0) | 2022.10.07 |
댓글