개요
이번 포스팅에서 나오는 주요 키워드
- 빌드 도구: Maven, Gradle, Groovy, Ant
- 파일 구분: 자바 파일(.java), 클래스 파일(.class)
- 패키지와 의존성: 패키지의 역할, Maven 의존성 관리, Gradle의 동적 버전 관리
- 예외 처리: MalformedURLException, IOException
- 네트워크 통신: URLConnection, HttpURLConnection
- JSON: JSONObject, JSONArray, JSON 형식
- 입출력: BufferedWriter, BufferedReader, StringBuilder
- 크롤링: Selenium, ChromeDriver, WebDriver
- 경로 탐색: XPath, CSS Selector
- WebDriver: 추상화, findElement, WebElement
본문
Q1. 자바 프로젝트에서 Maven, Groovy, Gradle, Ant, SBT 등의 빌드 도구를 사용하는 이유는 무엇인가요?
A1. 빌드 도구를 사용하면 프로젝트의 빌드, 테스트, 배포 작업을 자동화하고 의존성 관리를 효율적으로 수행할 수 있다.
Q2. 자바 파일과 자바 클래스 파일의 차이는 무엇인가요?
A2. 자바 파일(.java)은 소스 코드가 담긴 파일이며 개발자가 작성하는 소스 코드이고,
자바 클래스 파일(.class)은 소스 코드가 컴파일된 바이트 코드 파일이며 JVM에서 바로 실행 가능하다.
* 자바의 Write Once, Run Everywhere 이라는 철학은 (아무데에서나 이용가능 ; 크로스 플랫포머블)
JVM 이라는 자바 가상환경을 그 어떤 플랫폼(OS)위에 설치를 한다면 .class 파일을 어디에서든지 실행시킬수 있다는 장점에서 왔다.
Q3. 자바의 패키지란 무엇인가요?
A3. 패키지는 클래스를 구조적으로 관리하고 이름 충돌을 방지하기 위한 단위이다. 명시적인 패키지는 폴더 구조와 매핑된다.
Q4. Maven 프로젝트에서 의존성 버전을 명시하지 않으면 어떤 문제가 발생할 수 있나요?
A4. 의존성 버전을 명시하지 않으면 라이브러리 간 충돌이나 예기치 않은 동작이 발생할 수 있다. Gradle은 동적 버전 관리로 최신 버전을 자동으로 사용 가능하다.
Q5. URL 클래스를 생성자를 이용해 main에 선언하였더니 에러가 발생하였습니다. 이유와 해결 방법을 설명해주세요.
A5. URL 클래스의 생성자는 예외를 던지므로, 예외 처리를 해주어야 합니다.
URL 형식이 잘못되었을 때 MalformedURLException이 발생하므로, try-catch 블록으로 예외를 처리하거나 메서드에 throws 절을 추가하여 호출자에게 예외를 전파할 수 있습니다.
Q6. MalformedURLException을 IOException으로 변경하였습니다. 이유가 무엇인가요?
A6. MalformedURLException은 IOException의 하위 클래스이므로, IOException으로 변경해도 문제가 없습니다.
IOException은 입출력 작업 중 발생하는 예외를 처리하기 위한 상위 클래스입니다.
하지만 Spring을 활용해 어플리케이션을 만들거나 같은 메서드에서 여러가지 예외가 발생하고, 이를 서로 다르게 핸들링(처리) 해야 되는 경우에는 명확하게 핸들링 해주어야한다.
Q7. (복습) url.openConnection()을 HttpURLConnection으로 형변환하지 않으면 어떤 문제가 발생하나요?
A7. url.openConnection() 메서드는 URLConnection 타입을 반환합니다.
HttpURLConnection의 메서드를 사용하려면 HttpURLConnection으로 명시적 형변환이 필요합니다.
Q8. HttpURLConnection의 setRequestMethod 메서드를 이용하여 GET 방식으로 요청을 보내려고 합니다. 이때 setRequestMethod 메서드의 인자로 POST를 전달하면 어떤 문제가 발생할 수 있나요?
A8. POST를 전달하면 GET 방식이 아닌 POST 방식으로 요청이 전송됩니다. GET 방식은 URL에 데이터를 포함하며, POST 방식은 요청 본문에 데이터를 담아 전송하기 때문에 서버에서 처리 방식이 달라질 수 있습니다.
*GET과 POST 의 차이점은 뭘까요? 멱등성에 대해 알고있나요?
Q9. 왜 API_KEY (인증키) 앞에 Bearer를 붙여서 전송하는지 설명해주세요.
A9. Bearer는 HTTP 인증 방식으로, API_KEY와 함께 사용됩니다. Bearer를 사용하면 서버가 API_KEY를 인증 토큰으로 인식하여 인증을 수행할 수 있습니다.
RFC6750 에서 명시됨.
Q10. JSONObject 객체에 .put 메서드를 이용하여 key-value 쌍을 추가하였습니다. 이때 key에 null을 전달하면 어떤 문제가 발생할 수 있나요?
A10. key에 null을 전달하면 NullPointerException이 발생할 수 있습니다. JSONObject는 null을 key로 허용하지 않으며, 이를 시도하면 예외가 발생합니다.
Q11. JSONObject 객체에 .put 메서드를 이용하여 두 개의 인자를 전달하였습니다. 이때 각각의 인자가 어떤 역할을 하는지 설명해주세요.
A11. 첫 번째 인자는 key로, 두 번째 인자는 value로 사용됩니다.
JSONObject는 key-value 쌍으로 데이터를 저장하며, 이를 통해 JSON 데이터를 구성할 수 있습니다.
보다싶이 슈퍼클래스로 Map<K,V> 를 가지고 있다.
Q12. JSONArray 객체에 .put 메서드를 이용하여 JSONObject 객체를 추가하였습니다. 이때 JSONArray 객체에 JSONObject 객체를 추가하는 이유는 무엇인가요?
A12. JSONArray는 여러 개의 JSON 객체를 저장할 수 있는 컨테이너입니다. JSONObject를 JSONArray에 추가하면 배열 형태로 여러 객체를 관리할 수 있습니다.
이런식으로 구조를 까보는(?) 습관이 좋습니다ㅎㅎ
Q13. BufferedWriter 객체를 생성할 때 new OutputStreamWriter(con.getOutputStream())를 인자로 전달하였습니다. 이때 왜 OutputStreamWriter를 사용하는지 설명해주세요.
A13. BufferedWriter 객체를 생성할 때 OutputStreamWriter를 사용하는 이유는, 문자를 바이트로 변환하여 출력 스트림에 쓰기 위함입니다.
BufferedWriter는 출력 속도를 높이기 위해 버퍼를 제공하며, OutputStreamWriter는 문자 데이터를 바이트 스트림으로 변환합니다.
Q14. BufferedWriter 객체의 .write 메서드를 이용하여 data.toString()을 전달하였습니다. 이때 data.toString()이 반환하는 값의 타입은 무엇인가요?
A14. data.toString()이 반환하는 값의 타입은 String입니다.
JSON 객체를 문자열로 변환하여 출력하거나 전송할 수 있게 하기 위함입니다.
웹서버-클라 통신은 JSON 을 활용하기 때문에 외부 API등을 이용할때 해당 형식으로 바꿨을것이라고 예상 할수 있다.
Q15. StringBuilder 객체를 생성할 때 new StringBuilder()를 인자로 전달하였습니다. 이때 왜 StringBuilder를 사용하는지 설명해주세요.
A15. StringBuilder는 문자열을 동적으로 변경하기 위해 사용됩니다.
StringBuilder는 불변 객체인 String과 달리, 문자열 조작 시 새로운 객체를 생성하지 않고 내부 버퍼를 이용하여 성능을 향상시킵니다.
*동적으로 문자열을 결합할 때 이점이 있다는 특성이 있기에 알고리즘 풀이시에 활용한다.
Q16. 외부 API를 사용할 때 BufferedWriter, BufferedReader를 사용하는 이유는 무엇인가요?
A16. BufferedWriter와 BufferedReader는 입출력 속도를 향상시키기 위해 버퍼를 제공하며, StringBuilder는 문자열 조작 시 새로운 객체를 생성하지 않고 내부 버퍼를 사용해 성능을 최적화합니다.
* 이를 통해 외부 API와의 데이터 처리 성능이 개선됩니다. 응답 데이터가 불규칙하거나 대량일 경우에 데이터를 부분적으로 읽는 특징이 있기에 메모리의 효율적 사용이 가능합니다.
Q17. JSON 형식이란 무엇인가요? JSON 형식의 특징을 설명해주세요.
A17. JSON(JavaScript Object Notation)은 데이터를 키-값 쌍으로 표현하는 경량 데이터 형식입니다.
사람이 읽고 쓰기 쉬우며, 기계가 분석하고 생성하기 쉽습니다. 간결하고 다양한 프로그래밍 언어에서 지원됩니다.
Q18. 크롤링 시 사용하는 Selenium 사용에는 왜 ChromeDriver가 필요한가요?
A18. Selenium은 웹 애플리케이션을 테스트하기 위한 프레임워크입니다.
ChromeDriver는 Selenium이 Chrome 브라우저를 제어하기 위해 필요한 드라이버로, 브라우저와의 통신을 가능하게 합니다.
Q19. Driver란 무엇인가요? (운영체제와 하드웨어 사이의 관계)
A19. Driver는 하드웨어와 운영체제 간의 통신을 가능하게 하는 소프트웨어입니다. 운영체제는 Driver를 통해 하드웨어를 제어하며, 이는 인터페이스 역할을 수행합니다.
Q20. 여러 브라우저마다 드라이버가 다르고 매번 이를 선언할 수 없으니 WebDriver를 사용합니다. 이때 WebDriver를 사용하는 이유는 무엇인가요? (객체지향-추상화)
A20. WebDriver는 여러 브라우저를 동일한 방식으로 제어할 수 있는 인터페이스를 제공하여 개발자가 브라우저마다 개별적으로 드라이버를 다룰 필요 없이 동일한 코드를 사용할 수 있게 합니다.
Selenium의 WebDriver API는 이 추상화 개념을 기반으로 설계되었으며, ChromeDriver, GeckoDriver(Firefox), EdgeDriver 등을 동일한 방식으로 제어할 수 있습니다.
이를 통해 각 브라우저마다 다른 드라이버를 선언하지 않고도 객체지향 프로그래밍의 추상화를 활용해 일관성 있게 제어할 수 있습니다.
Q21. 웹 컴포넌트의 경로를 가져오는 방법 중에 XPath와 CSS Selector가 있습니다. 이 둘의 차이점을 설명해주세요.
A21. XPath는 XML 문서에서 노드를 찾기 위한 경로 표현식으로, HTML 요소의 계층적 구조를 탐색할 때(부모-자식) 관계 유리합니다.
CSS Selector는 HTML 요소를 스타일링하거나 선택하기 위한 간결한 구문으로, 속성과 클래스 기반 선택이 유리합니다.
Q22. WebDriver 객체의 findElement 메서드를 이용하여 웹 컴포넌트를 가져왔습니다. 이때 findElement 메서드의 반환값은 무엇인가요?
A22. findElement 메서드의 반환값은 WebElement 객체입니다. WebElement는 HTML 요소를 나타내며, 해당 요소의 속성이나 동작을 제어할 수 있습니다.
출처 & 추가로 알아보면 좋은것
- 빌드 도구 비교
Maven과 Gradle의 차이 및 장단점. - JSON 데이터 처리
JSON 관련 라이브러리의 사용법과 성능 비교(GSON, Jackson). - Selenium 활용 사례
Selenium의 다양한 WebDriver 설정 및 테스트 자동화 예제. - HTTP 프로토콜 심화
GET과 POST의 멱등성, HTTP 메서드의 특징과 사용 사례. - XPath와 CSS Selector
성능 비교와 실제 사례에 따른 사용 가이드.
'Java' 카테고리의 다른 글
Java 조각모음 [3] (0) | 2025.01.20 |
---|---|
예제로 배우는 자바 String Pool 이해하기 (0) | 2025.01.20 |
Java 조각모음 [1] (1) | 2025.01.16 |
ArrayList/LinkedList 단순 순회시 For, Enhanced For , Iterator, ListIterator, Stream.forEach() 성능비교 (1) | 2024.08.27 |
자바 가비지 컬렉터(GC)의 발전; 시리얼 컬렉터부터 ZGC까지 (0) | 2024.07.20 |